Python中的同时赋值语义

hqu*_*ilo 11 python simultaneous variable-assignment semantics

请考虑以下Python 3代码:

a = [-1,-1,-1]
i = 0
Run Code Online (Sandbox Code Playgroud)

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

作业版本1:

a[i],i = i,i+1
Run Code Online (Sandbox Code Playgroud)

作业版本2:

i,a[i] = i+1,i
Run Code Online (Sandbox Code Playgroud)

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

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

[0, -1, -1] 1
Run Code Online (Sandbox Code Playgroud)

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

[-1, 0, -1] 1
Run Code Online (Sandbox Code Playgroud)

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

链接到Google图书中的书摘

对于同时分配的Python语义,我是否缺少一些东西?

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

Joh*_*ooy 10

在这种情况下:

i, a[i] = i + 1, i
Run Code Online (Sandbox Code Playgroud)

右侧评估为元组(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]
Run Code Online (Sandbox Code Playgroud)

  • @hquilo:"同时分配"甚至没有出现在Python文档中.`a,b = 1,2`只是`(a,b)=(1,2)`的简写,称为序列解包. (3认同)