交换容器中的项目 - 评估顺序
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]
为清楚起见进行了编辑:
为什么列表项不交换?
# 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]