小编典典

Python赋值运算符优先级-(a,b)= a [b] = {},5

python

我在Twitter上看到了这个Python代码段,并对输出感到困惑:

>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}

这里发生了什么?


阅读 173

收藏
2020-12-20

共1个答案

小编典典

Assignment语句
文档中

赋值语句评估表达式列表(请记住,它可以是单个表达式或逗号分隔的列表,后者产生一个元组),并将单个结果对象从左到右分配给每个目标列表。

您有两个分配目标列表;a, b,和a[b],该值{}, 5从左到右分配给这两个目标。

首先,将{}, 5元组解包到a, b。您现在有a = {}b = 5。注意这{}是可变的。

接下来,您将相同的字典和整数分配给a[b],其中a对字典求值,对b进行求值5,因此您5将字典中的键设置为元组,({}, 5)从而创建了循环引用。将{...}由此指相同的对象a已被引用。

由于分配是从左到右进行的,因此您可以将其细分为:

a, b = {}, 5
a[b] = a, b

因此a[b][0]与以下对象相同a

>>> a, b = {}, 5
>>> a[b] = a, b
>>> a
{5: ({...}, 5)}
>>> a[b][0] is a
True
2020-12-20