近日辞职待工,没有实际的项目与大家分享。暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑。

首先我们需要明确一个概念,在python中一且皆对象。我们一般定义一个变量a=0,其实质a是一个类型变量,python 会把a封装为一个pyObject。我后面会用type方法来说明这个问题。

说在前面,在python 中变量名是一个类似标签的东西。它之前是什么类型与它之后是什么类型完全没有关系。我们可以把它理解为一个贴纸,可以随意从区块A撕下来贴到区块B上。正因为有这个特点,我们在使用python 对变量赋值时就无需担心变量类型问题。当然,为了规范和后面代码维护方便,此种做法需要节制,不然会让自己都搞不清最终需要的对象到底个什么类型,不方便调程序。

不可变对象

不可变对象一般包括int, float, bool, str, tuple. 不可变对象在函数调用过程中不会被更改,除非重新赋值。

这个例子中,a的类型为 int 说明它是一个类实例对象,根据python官方文档https://docs.python.org/3/library/functions.html#int,显示 class int ,进一步证实我们开篇提到的问题。 我们看到将变量a传入函数addTwoNum 中,将a+b的值赋给a并返回。从结果上看a的值并没有发生改变。我们在来看看各个变量的id。

这里我们看到,a 和 c 的id 不一样,说明它们是两个独立的存储区域。我们在看另一种写法。

这里我们看到,a 的id发生了变化,而且巧合的是现在的a 的id和 c 一样。说明此时a 的指向已经发生了改变。通过这个例子我们可以下这么个结论:不可变对象的存储区域相互独立。每次产生以个新的不可变对象则重新开辟一块区域。

可变对象

可变对象主要包括:list, dict, set。可变对象在参数传递过程会被改变。下面给出一个简单的例子:

我们看到,函数的返回类型什么也没有,但是li 列表的值确实发生了变化,我们还观察到一个很有意思的事,li 中元素的id 值都顺延了,不知道是不是由于li 中值时连续的整数的原因。为了证明li 的首部没有变,及li 本身指向的区块没有变,我们加入打印li 的id 的语句

从图上可以发现,li 的id 确实没有改变。从而可以说明li 没有变,但其值发生了变化。

运用

在知道了不可变对象和可变对象的特性后 ,我们可以根据它们各自的特点避免一些坑,特别是可变对象。在申明函数时,若函数参数存在可变变量,如果不需要每次都产生新的存储空间,我们可以不用另加判断,其中特别需要注意的函数中的局部变量一定不能与全局变量重名。如果需要每次都产生新的存储空间,那么最好是在函数内部声明一个变量,然后最后返回。例如,第一种情况,不需要每次都产生新的存储空间。

每执行一次函数,li 就增加两个元素。这种特性,用在递归中有很好的效果。给出一个括号匹配的算法,其中就运用到了可变变量这个能不断修改元素、添加元素的特性。

defgenerateParenthesis(N):

ans=[]def backtrack(S = '', left = 0, right =0):if len(S) == 2 *N:

ans.append(S)return

if left

backtrack(S+'(', left+1, right)if right

backtrack(S+')', left, right+1)

backtrack()return ans

第二种情况,每次都需要开辟新的存储空间:

虽然不可变变量与可变变量是一个简单的问题,我们也不能小看它呀,有时往往就是这种细小的错误让人抓狂。简单的一篇博文,有不足之处请及时指出,共同进步。

python哪些是可变对象_python 中的可变对象与不可变对象相关推荐

  1. python中函数的可变参数_Python中函数的参数定义和可变参数

    转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html 刚学用Python的时候,特别是看一些库的源码时,经常会看到fun ...

  2. python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  3. python哪些是可变对象_Python中的可变对象和不可变对象

    一.python中的变量与对象 首先在理解python的可变对象和不可变对象时,要理解python的赋值操作.在python中,一切事物皆是对象,变量是对象在内存中的存储和地址的抽象 对变量的理解 在 ...

  4. python中元组的值可变吗_python中对象的可变与不可变

    在python中一切皆对象,对象是对数据的抽象. 所有对象有三个要素:类型.标识.值.类型决定对象可以支持哪些操作:标识指的是对象的内存地址,每个对象有唯一的地址,通过id内建函数可以求出地址:值从字 ...

  5. python中字典长度可变吗_python中列表长度可变吗

    python中列表长度可变吗?下面给大家介绍一下python中可变和不可变的类型: 可变.不可变 可变/不可变类型,指的是:内存id不变,type也不变的前提下,value是否是可变的. int()和 ...

  6. python中的对象_Python中的变量、对象

    由于没时间系统学习下Python 只能见一个问题探究一个问题了 一.初级 - 对象 关于Python中的数据类型,今天重新认识了下.[参考] 首先,Python中,对象才有类型, 变量是没有类型的,它 ...

  7. python列表长度可变吗_python中列表长度可变吗

    python中列表长度可变,可变类型指的是内存id不变,type也不变的前提下,value是否是可变的.列表和字典都是可变类型,对于可变对象,比如list,对list进行操作,list内部的内容是会变 ...

  8. python比较两个数的和_Python中的is和==比较两个对象的两种方法

    Python中的is和==比较两个对象的两种方法 在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的 ==比较的是值(如同java中的equals方法) is比较的是引 ...

  9. python一切皆对象_Python中一切皆为对象

    众所周知,面向对象语言的特点即为"万物皆为对象",其中以Java开发尤为突出.那么在python中,这个 一切 是怎么表现出来的呢? 一切皆为对象(函数和类也是对象) 在Pytho ...

  10. python中什么叫类、什么叫对象_python中的类面向对象的基本概念!

    一.概述 今天我们讲述Python中的类&面向对象的基本概念. 首先我们为什么要学习面向对象,我讲一个故事,应该就可以明白了.在古时候,官府衙门如果要颁布什么告示就会去找工匠将命令中的字都雕刻 ...

最新文章

  1. [C编码笔记] 空串与NULL是不一样的
  2. 青龙羊毛——鸡厂签到
  3. linux环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
  4. 权限操作-springSecurity概述及快速入门步骤分析
  5. Linux版本Oracle工具,Linux下oracle可视化操作工具sqldeveloper安装与配置
  6. RichEdit 各个版本介绍
  7. 代码的抽象三原则【转载】
  8. [CLR via C#]18. Attribute
  9. 漫画:什么是桶排序?
  10. ALOS 12.5米精度DEM数据下载与处理
  11. [AHK]--显示器输入源快速切换
  12. 三星 android驱动安装失败,解决三星驱动SAMSUNG Mobile USB CDC Composite Device安装失败问题 - YangJunwei...
  13. CSAPP第八章家庭作业参考答案
  14. 国密算法概述 SM1、SM2、SM3、SM4、SM7、SM9、ZUC
  15. Pytorch——如何创建一个tensor与索引和切片(二)
  16. 计算机网络读书笔记(一)
  17. setsockopt与getsockopt的参数解析与使用
  18. AD5541+XTR111非标准测试
  19. php期末设计总结,PHP设计模式总结
  20. 台风来袭,推荐 韩国电影《熔炉》

热门文章

  1. DEX VMP与ARM VMP
  2. Android tinyplay与tinycap流程(十六)
  3. Android使adb作为host运行在arm64平台
  4. android mount --bind挂载目录
  5. Java如何连接Mysql数据库
  6. 阿里云轻量应用服务器/腾讯云轻量应用服务器如何安装宝塔面板?
  7. oracle 存储过程导出sql语句 导出为文件
  8. python散点图拟合曲线如何求拟合_python 拟合曲线并求参
  9. win10系统日志显示不可用sid_win10系统电脑修改sid安全标识符的操作方法
  10. php中array怎么用,php中array()函数如何使用