Python中的同时赋值语义
作者:互联网
请考虑以下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后的打印输出(a,i):
[0, -1, -1] 1
分配版本2后的打印输出(a,i):
[-1, 0, -1] 1
我不是Python的语义专家,但这种行为似乎很奇怪.我希望这两个赋值都表现为赋值版本1.此外,如果您检查以下链接,可以预期两个赋值版本将导致相同的状态:
Link to book excerpt in Google Books
对于同时分配的Python语义,我是否缺少一些东西?
注意:这种奇怪的行为似乎不可重现,例如,当变量a具有整数类型时;它似乎需要一个类型列表(也许这是任何可变类型的情况?).
解决方法:
在这种情况下:
i, a[i] = i + 1, i
右侧评估为元组(1,0).然后将这个元组解压缩到i然后再打开[i]. a [i]在拆包期间评估,而不是之前,因此对应于[1].
由于在进行任何拆包之前评估右侧,所以无论i的最终值如何,参考右侧的[i]始终为[0].
这是另一个无用的有趣例子供你锻炼
>>> a = [0,0,0,0]
>>> i, a[i], i, a[i] = range(4)
>>> a
[1, 0, 3, 0]
标签:python,variable-assignment,semantics,simultaneous 来源: https://codeday.me/bug/20190927/1822603.html