python不可变类型为什么不可变,python中不可变的数据类型

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: