python的数据类型和c不太一样,有一种分类标准,可变(mutable)/不可变(immutable).
我理解的可变,就是在内存中的那块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
不可变类型:string,integer,tuple
>>> var1 = 1
>>> var2 = var1
>>> var1,var2
(1, 1)
>>> id(var1),id(var2) #同指同一内存区域,id相同
(21200672, 21200672)
>>> var1 += 1
>>> var1,var2
(2, 1)
>>> id(var1),id(var2)#由于var1,var2数据不可变的,对var1+1后,申请另外一块区域,id(var1)变了,id(var2)不变,对此区域ref数字-1
(21200660, 21200672)
>>>
可变类型:list,dict
>>> lst1 = [1,2,3]
>>> lst2 = lst1
>>> lst1,lst2
([1, 2, 3], [1, 2, 3])
>>> id(lst1),id(lst2)
(28497360, 28497360)
>>> lst1.append(4)#可变类型的,append后,address会保持不变
>>> lst1,lst2
([1, 2, 3, 4], [1, 2, 3, 4])
>>> id(lst1),id(lst2)#lst1,lst2一直指向同一区域
(28497360, 28497360)
>>>
在操作这种类型的时候要特别小心,dict的key不用可变类型的,函数传参的时候不用可变类型的。
eg:
>>> def dis(arg=[]):
... arg.append('1')
... print arg
...
>>> dis()
['1']
>>> dis()
['1', '1']
>>> dis()
['1', '1', '1']
>>>