Python中的同时赋值语义

时间:2013-05-07 01:39:15

标签: python variable-assignment semantics simultaneous

考虑以下Python 3代码:

a = [-1,-1,-1]
i = 0

现在考虑以下两个版本同时分配a和i:

作业版本1:

a[i],i = i,i+1

作业版本2:

i,a[i] = i+1,i

我希望这两个版本的同时分配在语义上是等效的。但是,如果在每个同时分配后检查a和i的值,则会得到不同的状态:

分配版本1后print(a,i)的输出:

[0, -1, -1] 1

分配版本2后print(a,i)的输出:

[-1, 0, -1] 1

我不是Python语义的专家,但这种行为似乎很奇怪。我希望这两个赋值行为都可以作为赋值版本1.此外,如果您检查以下链接,可以预期两个赋值版本将导致相同的状态:

Link to book excerpt in Google Books

对于同时分配的Python语义,我是否缺少某些内容?

注意:这种奇怪的行为似乎不可重现,例如,当变量a具有整数类型时;它似乎要求a是类型列表(可能这是任何可变类型的情况?)。

1 个答案:

答案 0 :(得分:9)

在这种情况下:

i, a[i] = i + 1, i

右侧评估为元组(1,0)。然后将此元组解压缩到i,然后a[i]}在解包期间被评估,而不是之前,因此对应于a[i]

由于在进行任何解包之前会评估右侧,因此无论a[1]

的最终值如何,在右侧参考a[i]始终为a[0]

这是另一个无用的有趣例子供你解决

i