我在Twitter上看到了这个Python代码段,并对输出感到困惑:
>>> a, b = a[b] = {}, 5 >>> a {5: ({...}, 5)}
这里发生了什么?
从 Assignment语句 文档中:
赋值语句评估表达式列表(请记住,它可以是单个表达式或逗号分隔的列表,后者产生一个元组),并将单个结果对象从左到右分配给每个目标列表。
您有两个分配目标列表;a, b,和a[b],该值{}, 5从左到右分配给这两个目标。
a, b
a[b]
{}, 5
首先,将{}, 5元组解包到a, b。您现在有a = {}和b = 5。注意这{}是可变的。
a = {}
b = 5
{}
接下来,您将相同的字典和整数分配给a[b],其中a对字典求值,对b进行求值5,因此您5将字典中的键设置为元组,({}, 5)从而创建了循环引用。将{...}由此指相同的对象a已被引用。
a
b
5
({}, 5)
{...}
由于分配是从左到右进行的,因此您可以将其细分为:
a, b = {}, 5 a[b] = a, b
因此a[b][0]与以下对象相同a:
a[b][0]
>>> a, b = {}, 5 >>> a[b] = a, b >>> a {5: ({...}, 5)} >>> a[b][0] is a True