这几乎就像是一个等待发生的“罗素悖论” ... :-)。我很确定这一定是一个众所周知的问题,但是我没有对此进行很多讨论。
我在python3上。我意识到列表可以包含自身
s = [1, 2, 3]
s[1] = s
结果与
s
#[1, [...], 3]
这导致许多有趣的结果。例如,只是为了好玩:
s in s
#True
s[1][1][1][1][1][1][1] == s
#True
但是,现在最让我困惑的是:
id(s)
#2452848996168
id(s[1])
#2452848996168
好的。这是同一个对象。但为什么
s[1] = 5
s
#[1,5,3]
id(s)
#2452848996168
因此,如果ids
不变,而我刚将ID设置为5的对象,为什么我就s
不能做到公正5
呢?python如何知道将第二个元素设置为第一层?
更奇怪的是尝试
s[1][1][1][1] = 5
而且你仍然得到
s
#[1, 5, 3]
我该如何缠住我的头?
您没有将ID设置为5的对象。而是将列表的某个元素设置为5。可以将列表索引视为指向对象的“标签”或“指针”。在设置中s[1] = 5
,您没有更改s[1]
先前引用的对象;您更改了s[1]
指向的内容。
另一种思考的方式是:最初您有s = [1, 2, 3]
。现在假设您这样做s[1] = 5
。您是“将2变成5”吗?不。您只是s
从“我的第二个要素是这个数字2”变为“我的第二个要素是这个数字5”。同样,在您的示例中,您只是s
从“我的第二个要素是我自己”转变为“我的第二个要素是数字5”。
您后面的with实例s[1][1][1][1] = 5
是同一件事,因为s[1][1][1]
is是s
,所以您对do所做的任何事情都与tos[1][1][1]
相同s
。这可以用数学风格的“证明”来显示:
s[1][1][1][1] = 5
(s[1][1][1])[1] = 5 # indexing operations group left to right
s[1] = 5 # substitute s for s[1][1][1] since they are the same
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句