多任务评估的棘手顺序

时间:2015-11-20 20:33:53

标签: python variables operator-precedence

我知道有关Python中多重赋值的基本规则:

  • 首先评估作业右侧的所有表达
  • 然后将评估值绑定到左侧部分的变量

但实际上我遇到了一些非常不同而且有点复杂的东西;我想知道我是否可以依赖它。在调试算法时,我突然发现一个错误与该行有关:

k[s], k[p] = k[p], None

因为我的算法找到了sp相等的情况。显然,在这种情况下,最终值为k[s]=k[p]=None

在那个非常具体的案例中,我更喜欢以下结果:

k[p], k[s] = None, k[p]

在所有情况下都表现得如我所愿,即使p == s也是如此。在这种情况下,显然k[p]最初取值None,然后取值k[p]

当然我知道为了拥有更易读的代码,进行一次测试可能是一个好主意,但我非常想知道该语言的政策在那个鲜为人知的案例中: em>当多个赋值中同一个变量受到两次影响时会发生什么?

2 个答案:

答案 0 :(得分:2)

是的,你应该能够依赖它。

来自reference documentation

  

如果目标列表是以逗号分隔的目标列表:对象必须是一个可迭代的项目数与目标列表中的目标相同,并且项目已分配,从从左到右,对应相应的目标。

(强调我的)

k[s], k[s] = k[s], None

相当于

t = k[s]
k[s] = t
k[s] = None

附注:当右侧是动态可迭代时,评估顺序也成立,例如发电机。首先提取所有必要的元素,然后从左到右分配。

答案 1 :(得分:1)

python docs给出了答案:

  

如果目标列表是以逗号分隔的目标列表:该对象必须是具有与目标列表中的目标相同数量的项目的可迭代项,并且项目已分配给from left to right,以相应的目标。