我认为两者是一样的。
nums = [1, 2, 0]
nums[nums[0]], nums[0] = nums[0], nums[nums[0]]
print nums # [2, 1, 0]
nums = [1, 2, 0]
nums[0], nums[nums[0]] = nums[nums[0]], nums[0]
print nums # [2, 2, 1]
但是结果不一样。
为什么结果不同? (为什么第二个是那个结果?)
最佳答案
先决条件 - 2 个要点
列表是可变的
列表的主要部分是列表是可变的。这意味着 列表的值可以更改。这是你的原因之一 面对麻烦。 Refer the docs for more info
评估顺序
另一部分是在解包元组时,评估开始 从左到右。 Refer the docs for more info
简介
当您执行 a,b = c,d
时,首先存储 c
和 d
的值。然后从左边开始,先将a
的值改为c
,然后将b
的值改为 d
。
这里的问题是,如果在更改 a
的值时对 b
的位置有任何副作用,那么 d
就是分配给 later b
,即受 a
副作用影响的 b
。
用例
现在解决你的问题
在第一种情况下,
nums = [1, 2, 0]
nums[nums[0]], nums[0] = nums[0], nums[nums[0]]
nums[0]
最初是 1
而 nums[nums[0]]
是 2
因为它计算结果为 nums[1]
。因此 1,2 现在存储在内存中。
现在元组拆包发生在左侧,所以
nums[nums[0]] = nums[1] = 1 # NO side Effect.
nums[0] = 2
因此 print nums
将打印 [2, 1, 0]
但是在这种情况下
nums = [1, 2, 0]
nums[0], nums[nums[0]] = nums[nums[0]], nums[0]
nums[nums[0]], nums[0]
像第一种情况一样将 2,1 放入堆栈。
但是在左侧,即 nums[0], nums[nums[0]]
,nums[0]
的改变有一个副作用因为它被用作 nums[nums[0]]
中的索引。因此
nums[0] = 2
nums[nums[0]] = nums[2] = 1 # NOTE THAT nums[0] HAS CHANGED
nums[1]
的值 2
保持不变。因此 print nums
将打印 [2, 2, 1]
关于python - 元组解包顺序更改分配的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53842638/