python - 为什么浅拷贝不影响列表中的单个元素?
问题描述
我正在使用浅拷贝将一个列表元素复制到另一个,当我尝试浅拷贝并通过更新它在父对象中更新的 dict 和列表元素的值进行检查时,列表包含 dict 和另一个列表元素,但是当我尝试更新未更新为父元素的单个元素。下面是我的代码:
import copy
li1 = [{"a": 20}, 2, [3,5], 4]
print ("Before shallow copy1 ", li1)
li2 = copy.copy(li1)
li2[2][1] = 7
li2[1] = "C"
li2[0].update({"a": 30})
li2[3] = 50
print ("Aftr shallow copy 1", li1)
print ("Aftr shallow copy 2", li2)
# Output:
# Before shallow copy1 [{'a': 20}, 2, [3, 5], 4]
# Aftr shallow copy 1 [{'a': 30}, 2, [3, 7], 4]
# Aftr shallow copy 2 [{'a': 30}, 'C', [3, 7], 50]
这里改变了父列表中字典和列表(位置:0 和 2)元素的值,但单个元素(位置:1)的值没有改变。
解决方案
dict 元素发生了变化,因为您正在更新对象。
您的第二个元素不受影响,因为您正在重新分配一个新值。您正在做的是将一个新指针存储到您的列表中。这会更改存储在li2
但不存储在li1
.
您的第三个对象已更新,因为分配li2[2][1]
不会更改li2[2]
指向的列表。这意味着此处的指针未更新为指向新位置。所以你看到的东西li1
会受到影响。
但是li2[3]
是直接重新分配了列表中的那个位置。所以这意味着li1
不受影响。
推荐阅读
- c# - 为什么添加两个 .OrderBy(或 .OrderByDescending)语句会以相反的顺序应用排序?
- sql-server - 使用 FreeTDS 连接到 Raspberry Pi 上的 Azure SQL 服务器
- python - 在 django restframework 视图中显示外键选项
- javascript - .after() 省略了一些子 div
- django - 是否可以仅使用 Django 从 REST API 获取数据并将其绘制为图形?
- linux-kernel - 来自 Linux 内核驱动程序的 PCI-ISA 桥接通信
- ios - 如何手动调用“tableView numberOfRowsInSection”函数
- python - 我可以在使用 RegEx 后获取字符串中的特定元素并将其存储在变量中吗?
- javascript - Bootstrap JavaScript 不适用于 WebPack
- unix - 如何查看我的键盘发送的各种控制字符