python 可变 与 不可变类型
2014-05-09 12:08
281 查看
一、Python对象
见《Python 核心编程》
二、可变与不可变
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']
>>>
参考copy模块,了解更多。
参考:http://blog.chinaunix.net/uid-26249349-id-3080279.html
见《Python 核心编程》
二、可变与不可变
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']
>>>
参考copy模块,了解更多。
参考:http://blog.chinaunix.net/uid-26249349-id-3080279.html
相关文章推荐
- Python(可变/不可变类型,list,tuple,dict,set)
- Python 引用 :可变类型和不可变类型
- Python(可变/不可变类型,list,tuple,dict,set)
- python中数据类型(对象)的可变和不可变性
- python中不可变数据类型和可变数据类型
- python数据类型与变量总结,可变类型与不可变类型测试,·数据类型多功能的分类
- Python探索记(16)——Python的可变类型与不可变类型
- python 可变不可变类型
- 理解python可变类型vs不可变类型,深拷贝vs浅拷贝
- Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)
- python的可变类型与不可变类型
- Python-5 可变类型与不可变类型
- python不可变类型和可变类型
- python的可变类型和不可变类型
- Python函数之可变类型与不可变类型
- python中的可变与不可变类型
- Python的可变类型与不可变类型
- Python可变/不可变数据类型
- python-地址值判断、可变不可变类型、+=含义、global使用、缺省、不定长参数
- python作用域的补充,局部引用全局作用域的修改尝试,可变类型内部可修改,内存指向不可变