多重分配中棘手的评估顺序
Tricky order of evaluation in multiple assignment
我知道Python中关于多重赋值的基本规则:
- 首先评估赋值右侧的所有表达式
- 然后评估值绑定到左侧部分的变量
但实际上我遇到了一些完全不同且更复杂的事情;我想知道我是否可以依赖它。在调试一个算法的时候,突然发现一个bug和一行有关:
k[s], k[p] = k[p], None
因为我的算法发现 s
和 p
相等的情况。显然在这种情况下,最终值为 k[s]=k[p]=None
.
在那个非常具体的情况下,我更喜欢以下结果:
k[p], k[s] = None, k[p]
在所有情况下都如我所愿,即使在 p == s
时也是如此。在那种情况下,显然,k[p]
最初取值 None
,然后取回值 k[p]
。
当然,我知道为了获得更易读的代码而多做一次测试可能是个好主意,但我非常想知道在那个鲜为人知的案例中语言的政策: 当同一个变量在多重赋值中被影响两次时会发生什么?
是的,你应该可以依靠它。
If the target list is a comma-separated list of targets: The object must be an iterable with the same number of items as there are targets in the target list, and the items are assigned, from left to right, to the corresponding targets.
(强调我的)
k[s], k[s] = k[s], None
等同于
t = k[s]
k[s] = t
k[s] = None
旁注:当右侧是动态可迭代对象时,求值顺序也成立,例如发电机。所有必要的元素将首先被提取并从左到右分配。
pythondocs给出了答案:
If the target list is a comma-separated list of targets: The object must be an iterable with the same number of items as there are targets in the target list, and the items are assigned, from left to right
, to the corresponding targets.
我知道Python中关于多重赋值的基本规则:
- 首先评估赋值右侧的所有表达式
- 然后评估值绑定到左侧部分的变量
但实际上我遇到了一些完全不同且更复杂的事情;我想知道我是否可以依赖它。在调试一个算法的时候,突然发现一个bug和一行有关:
k[s], k[p] = k[p], None
因为我的算法发现 s
和 p
相等的情况。显然在这种情况下,最终值为 k[s]=k[p]=None
.
在那个非常具体的情况下,我更喜欢以下结果:
k[p], k[s] = None, k[p]
在所有情况下都如我所愿,即使在 p == s
时也是如此。在那种情况下,显然,k[p]
最初取值 None
,然后取回值 k[p]
。
当然,我知道为了获得更易读的代码而多做一次测试可能是个好主意,但我非常想知道在那个鲜为人知的案例中语言的政策: 当同一个变量在多重赋值中被影响两次时会发生什么?
是的,你应该可以依靠它。
If the target list is a comma-separated list of targets: The object must be an iterable with the same number of items as there are targets in the target list, and the items are assigned, from left to right, to the corresponding targets.
(强调我的)
k[s], k[s] = k[s], None
等同于
t = k[s]
k[s] = t
k[s] = None
旁注:当右侧是动态可迭代对象时,求值顺序也成立,例如发电机。所有必要的元素将首先被提取并从左到右分配。
pythondocs给出了答案:
If the target list is a comma-separated list of targets: The object must be an iterable with the same number of items as there are targets in the target list, and the items are assigned,
from left to right
, to the corresponding targets.