在这里我需要清楚的解释。 为什么以下代码有效?
foo1 = foo1[0] = [0]
好的,我知道任务是从左到右完成的。
python如何理解foo1
是一个列表?
顺便说一句,我知道foo1
最终以[[...]]
的第一个元素为自身。
答案 0 :(得分:29)
因为
foo1 = foo1[0] = [0]
等效于
temp = [0]
foo1 = temp
foo1[0] = temp
它首先计算表达式,然后从左到右分配。
逐行分析此行,您将了解发生了什么:
-首先在temp
中创建一个列表
-然后将列表temp
分配给foo1
使其成为列表(回答您的实际问题)
-第三行只是将第一个元素分配给列表本身(因此,输出中的[[...]])
更新2:将@blhsing评论中的相关问题更改为更相关的讨论:Python Multiple Assignment Statements In One Line
答案 1 :(得分:1)
Python变量根据分配给它的变量的类型知道它们的类型。它是一种动态类型语言。在您的代码中,解释器看到foo1 = foo1[0] = [0]
,并在末尾查找一个值,即[0]
。它是一个包含一个元素0
的列表。现在,将其分配给列表foo1
至foo1[0] = [0]
的第一个元素。但是由于foo1
已经声明,所以它创建了一个指向自身的指针的对象,因此foo1
得到了无限的自我引用,其中最里面的列表为0。
当代码为foo1
时,列表foo1 = foo1[0]
的结构将相同。
对象foo1
已进入无限的自引用循环。