为清晰起见编辑:
为什么列表项不交换?
# 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
答案 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]