python不可变类型为什么不可变,python中不可变的数据类型
Python 中有一些容易忽略的不可变类型Str、Integer、None、Tuple
#错误演示
in[45]: def demo(lst=[]):
. list . append( hello )
.returnlst
.
In[46]:demo()
Out[46]:[你好]
In[47]:demo()
Out[47]:[hello , hello]廖雪峰的Python教程提到了这一块,但并不是太详细。这里因为lst是一个可变参数,而在demo初始化的时候,lst参数指向了[]的一个内存空间,然后每次调用,[]这个内存空间追加一个“hello”,又因为lst仍然指向这个内存空间,所以你会看到demo函数调用的奇怪现象。问题的解决方案是引入不可变类型。
#正确演示
in[54]: def demo(lst=None):
.lst=[]
. list . append( hello )
.returnlst
.
In[55]:demo()
Out[55]:[你好]
In[56]:demo()
Out[56]:[hello]在正确的演示中,lst被初始化为None,这样lst就是一个不可变的参数,但是你不能直接使用append to lst,因为只有list才有append方法,所以你需要真正初始化lst=[]
可变类型和不可变类型是一个很容易被忽略的知识点。在这里,我们将进行深入的研究。下面是一些常见的不可变类型和可变类型。
不可变「mutable」类型:
int,long,float,string,tuple,frozenset
可变类型「immutable」类型:
列表,字典
Python中的所有变量都是对值的引用,这意味着变量通过绑定指向它们的值。这里的不变性是指值的不变性。对于不可变变量,如果你想改变变量,你会创建一个新值,将变量绑定到新值,如果旧值没有被引用,等待垃圾回收。下面,以int和list为代表进行说明。
#不可变类型
在[31]:id(1),id(2)
[31]3360(4477999936,4477999968)
[32]:a=1
在[33]:id(a)中
出去[33 ], 53860 . 48486886861
在[34]:#中,当A被赋予新值时,变量A将被绑定到新值
[35]:a=3
在[36]:id(a)中
[36]33604478000000
#可变类型
In[38]:lst=[0]
在[39]:id(第一页)
出去,出去,出去38360 . 43838383839
In[40]:lst=[0,1]
在[41]:id(第一页)
Out [41] 33604499600328表面上看,可变类型,python好像实现了不同类型的管理,其实不是。其实lst代表address,它所指的lst [0]和lst [1]的内存地址其实已经改变了,因为lst[i]是int(这里),int是不可变类型。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。