web-dev-qa-db-ja.com

Python交換:なぜA、B = B、B、A = A、Bと同等のもの)の理由

私たち全員が知っているように、2つの項目の値を交換するPythonic Way ab

a, b = b, a

そしてそれは同等であるべきです

b, a = a, b

しかし、今日私がいくつかのコードに取り組んでいたとき、私は誤って次の2つのスワップが異なる結果を与えることを発見しました:

nums = [1, 2, 4, 3]
i = 2
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
print(nums)
# [1, 2, 4, 3]

nums = [1, 2, 4, 3]
i = 2
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
print(nums)
# [1, 2, 3, 4]

これは私にとっては心が強くなっています。誰かが私にここで起こったことを説明できますか?私はPythonでは、2つの課題が同時にそして独立して起こると考えました。

166
Shaun Han

Thierryは良い答えを与えました、私はもっと明確にしましょう。 nums = [1, 2, 4, 3]の場合、

このコードでは:

nums[nums[i]-1], nums[i]
  • 私は2です、
  • nums [i] -1]はnums [4-1]、nums [3]、(値は3)です。
  • nums [i]はnums [2]、(値は4)
  • 結果は次のとおりです。(3,4)

このコードでは:

nums[i], nums[nums[i]-1]
  • nums [i]はnums [2]、(=> [1,2、、3])
  • しかし、nums [i] -1]はではなくnums [4 - 1]しかし、nums [ - 1]、nums [2]、(戻る)4(=> [1,2、4、3])

おそらくgoodスワップに関する質問が使用されていました:

nums[i], nums[i-1] = nums[i-1], nums[i]

それを試してみてください:

>>> print(nums)
>>> [1, 2, 4, 3]
>>> nums[i], nums[i-1] = nums[i-1], nums[i]
>>> print(nums)
>>> [1, 4, 2, 3]

Ch ch

0
tontonCD