分配规则.

我注意到赋值有一个(貌似)奇怪的行为,这使我几次犯了编程错误。


首先请参见以下示例:


>>> i = 0

>>> t = (i,)

>>> t

(0,)

>>> i += 1

>>> t

(0,)

正如预期的t那样,即使i增加了的值,唯一元素的值也不会改变。


现在查看以下内容:


>>> l = [0]

>>> t = (l,)

>>> t

([0],)

>>> l[0] += 1

>>> t

([1],)  # <- ?

我不明白为什么最初的零输入t现在是一; 如果我增加了对t...的引用


>>> t[0][0] += 1

...我知道它的值已更改,但是在前面的示例中情况并非如此,在l递增示例时,仅显式引用了它。

我有两个问题:

  1. 为什么会这样呢?

  2. 关于此,我应该注意一些特殊规则吗?


牧羊人nacy
浏览 133回答 2
2回答

一只甜甜圈

那是因为整数是不可变的,列表是可变的。>>> i = 0>>> t = (i,)>>> t[0] is i&nbsp; # both of them point to the same immutable objectTrue>>> i += 1&nbsp; # We can't modify an immutable object, changing `i` simply&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # makes it point to a new object 2.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # All other references to the original object(0) are still intact.>>> i1>>> t&nbsp; &nbsp; &nbsp; &nbsp;# t still points to the same 0(0,)>>> x = y = 1>>> id(x),id(y)(137793280, 137793280)>>> x += 1>>> id(x),id(y)&nbsp; &nbsp; &nbsp; &nbsp;#y still points to the same object(137793296, 137793280)对于列表:>>> l = [0]>>> t = (l,)&nbsp; &nbsp; &nbsp; &nbsp;>>> t[0] is l #both t[0] and l point to the same object [0]True>>> l[0] += 1 # modify [0] in-place>>> t([1],)>>> l[1]#another exmple>>> x = y =[]&nbsp; &nbsp; # x, y point to the same object>>> x.append(1)&nbsp; # list.append modifies the list in-place>>> x, y&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;([1], [1])&nbsp;>>> x = x + [2]&nbsp; # only changes x, x now points to a new object>>> x, y([1, 2], [1])

DIEA

在第二个示例中,t(元组)持有对l(列表)的引用。当您这样做时l[0] += 1,您正在更改列表,但是元组仍然保留对该列表的引用。在第一个示例中,当您执行时i += 1,您实际上是在创建一个新的整数,而您的元组不保存对它的引用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python