包含自身的列表 - 为什么重置其元素会影响第一级



这感觉就像一个等待发生的"罗素悖论"...... :-)。我很确定这一定是一个众所周知的问题,但我没有找到很多关于这个问题的讨论。

我在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

因此,如果 s 的 id 保持不变,并且我刚刚将此 id 的对象设置为 5,为什么我没有s只是5?python 是怎么知道在第 1 关设置第二个元素的?

更奇怪的是尝试这个

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"。

你后面的s[1][1][1][1] = 5例子是一回事,因为s[1][1][1]s,所以你对s[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

最新更新