交换容器中的项目 - 评估顺序

时间:2017-01-04 23:49:07

标签: python evaluation

为清晰起见编辑:

为什么列表项不交换?

# python 3.5
lst = [0, 1]
lookup = {0: 1, 1: 0}

lst[0], lst[lookup[lst[0]]] = lst[lookup[lst[0]]], lst[0]
# lst is still unchanged; why aren't items 0 and 1 not swapped

2 个答案:

答案 0 :(得分:1)

在lhs之前评估rhs。那不是问题。

问题是如何评估lhs。您可以通过运行以下声明向自己证明:

lst[0], lst[lookup[lst[0]]] = 1, 0

请注意,lst[0]的分配在评估lst[lookup[lst[0]]]之前发生。因此,该复杂表达式中的lst[0] new 值,而不是旧值。

打破它:

lst[0], lst[lookup[lst[0]]] = 1, 0
=> lst[0] = 1; lst[lookup[lst[0]]] = 0
=> lst[0] = 1; lst[lookup[1]] = 0
=> lst[0] = 1; lst[0] = 0

所以最终结果没有改变。

答案 1 :(得分:0)

由于:

lst[0], lst[lookup[lst[0]]] = lst[lookup[lst[0]]], lst[0]

相当于:

lst[0]= lst[lookup[lst[0]]]
lst[lookup[lst[0]]] = lst[0]