明瞭にするために編集:コンテナ内のアイテムを交換する -
なぜリストアイテムがスワップしないのですか?
# 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
明瞭にするために編集:コンテナ内のアイテムを交換する -
なぜリストアイテムがスワップしないのですか?
# 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]
は、新しいの値であり、古い値ではありません。
それを破壊:
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
を最終的な結果はそのまま表示されます。
ああ、右の笑。明確に考えなかった。 – max
ので:
lst[0]= lst[lookup[lst[0]]]
lst[lookup[lst[0]]] = lst[0]
これは、Python 3.5で正常に動作します:
と等価です。どうしたの? –
http://stackoverflow.com/questions/8725673/multiple-assignment-and-evaluation-order-in-python –
@VasiliSyrakis申し訳ありませんが、わかりやすくするために書き換えました。 – max