11

考虑以下 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 的值,您会得到不同的状态:

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

[0, -1, -1] 1

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

[-1, 0, -1] 1

我不是 Python 语义方面的专家,但这种行为似乎很奇怪。我希望这两个分配都表现为分配版本 1。此外,如果您检查以下链接,人们会希望两个分配版本都导致相同的状态:

链接到 Google 图书中的图书摘录

关于同时分配的 Python 语义,我有什么遗漏吗?

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

4

1 回答 1

11

在这种情况下:

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

右侧计算为元组 (1, 0)。这个元组然后被解包到i然后a[i]在解包期间a[i]而不是之前进行评估,因此对应于.a[1]

由于右侧是在任何拆包发生之前评估的,因此a[i]在右侧引用将始终a[0]与最终值无关i

这是另一个无用的有趣示例供您解决

>>> a = [0,0,0,0]
>>> i, a[i], i, a[i] = range(4)
>>> a
[1, 0, 3, 0]
于 2013-05-07T01:46:03.607 回答