为了账号安全,请及时绑定邮箱和手机立即绑定

分配规则.

分配规则.

牧羊人nacy 2021-03-07 15:19:36
我注意到赋值有一个(貌似)奇怪的行为,这使我几次犯了编程错误。首先请参见以下示例:>>> 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递增示例时,仅显式引用了它。我有两个问题:为什么会这样呢?关于此,我应该注意一些特殊规则吗?
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

那是因为整数是不可变的,列表是可变的。


>>> i = 0

>>> t = (i,)

>>> t[0] is i  # both of them point to the same immutable object

True

>>> i += 1  # We can't modify an immutable object, changing `i` simply 

            # makes it point to a new object 2.

            # All other references to the original object(0) are still intact.

>>> i

1

>>> t       # t still points to the same 0

(0,)

>>> x = y = 1

>>> id(x),id(y)

(137793280, 137793280)

>>> x += 1

>>> id(x),id(y)       #y still points to the same object

(137793296, 137793280)

对于列表:


>>> l = [0]

>>> t = (l,)       

>>> 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 =[]    # x, y point to the same object

>>> x.append(1)  # list.append modifies the list in-place

>>> x, y          

([1], [1]) 

>>> x = x + [2]  # only changes x, x now points to a new object

>>> x, y

([1, 2], [1])


查看完整回答
反对 回复 2021-03-31
?
DIEA

TA贡献1820条经验 获得超2个赞

在第二个示例中,t(元组)持有对l(列表)的引用。当您这样做时l[0] += 1,您正在更改列表,但是元组仍然保留对该列表的引用。在第一个示例中,当您执行时i += 1,您实际上是在创建一个新的整数,而您的元组不保存对它的引用。

查看完整回答
反对 回复 2021-03-31
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信