Python中的可变对象和不可变对象

 

什么是可变/不可变对象

  • 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
  • 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变

Python中,数值类型(intfloat)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。

还是看代码比较直观。先看不可变对象

不可变对象的例子

先说明一点is 就是判断两个对象的id是否相同, 而 == 判断的则是内容是否相同。

复制代码
a = 2 b = 2 c = a + 0  c += 0  print(id(a), id(b), id(2))  # id都相同print(c is b) #True
复制代码
 

再来看字符串

复制代码
astr = 'good' bstr = 'good' cstr = astr + ''print(cstr is bstr) # Trueprint(id(astr), id(bstr), id('good'))  # 三个id相同
复制代码
 

和数值类型的结果一样。如果是下面这种情况,变量修改后不在是good

复制代码
astr = 'good'print(id(astr)) astr += 'aa'print(id(astr)) # id和上面的不一样
复制代码
 

由于是不可变对象,变量对应内存的值不允许被改变。当变量要改变时,实际上是把原来的值复制一份后再改变,开辟一个新的地址,astr再指向这个新的地址(所以前后astr的id不一样),原来astr对应的值因为不再有对象指向它,就会被垃圾回收。这对于int和float类型也是一样的。

再看tuple

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信