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

Swapping items in container - evaluation order

为清楚起见进行了编辑:

为什么列表项不交换?

# 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

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

问题是如何评估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

因此最终结果似乎没有变化。

因为:

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

等同于:

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