python - 元组解包顺序更改分配的值

标签 python list indexing tuple-packing

我认为两者是一样的。

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 时,首先存储 cd 的值。然后从左边开始,先将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] 最初是 1nums[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/

相关文章:

c# - 复制列表中的更改

mysql - 将 MySQL PK 声明为唯一的唯一键

postgresql - 慢速嵌套循环左连接在循环中索引扫描 130k 次

python - 安装 Keras 时的 Linux 错误

python - 当执行 python 项目中的脚本时,如何添加 $PYTHONPATH 或 $PATH 变量的路径?

html - 大型下拉菜单中新样式列表的清晰列表样式

ios - IOS 应用程序的下拉菜单

python - 将列表列表解压到 pandas 数据帧中的性能

python - 如何在pydrake中正确使用MultibodyPlant::CalcGravityGeneralizedForces?

python - 从网络摄像头捕获图像并将其上传到 Flask 服务器