python - 浅拷贝列表
问题描述
我很难用下面的浅表弄清楚这里发生了什么。
在这段代码中,在对列表(matrix2)的浅表副本进行修改之后,我们替换了列表中的整个列表,虽然matrix2是matrix1的浅表副本,但更改仅反映在matrix2而不是matrix1。
>>> matrix1 = [[1, 2], [3, 4]]
>>> matrix2 = matrix1[:]
>>> matrix2[0] = [5, 6]
>>> matrix2
[[5, 6], [3, 4]]
>>> matrix1
[[1, 2], [3, 4]]
在这部分代码中,结果是不同的,因为列表列表中的值的修改反映了两个矩阵。
>>> matrix2[1][0] = 1
>>> matrix2
[[5, 6], [1, 4]]
>>> matrix1
[[1, 2], [1, 4]]
我发现如下:
发生这种情况是因为列表并不真正包含对象本身,而是对内存中这些对象的引用。当您使用[:]
符号制作列表的副本时,将返回一个新列表,其中包含与原始列表相同的引用。
你能帮我弄清楚以上文字的真正含义吗?也许我在这里遗漏了一些东西,我自己找不到答案。
解决方案
例如,您有一个列表matrix1=[[1,2], [3,4]]
并将其分配给
matrix2 = matrix1
. 当您分配matrix1
给它时,matrix2
它只是共享一个引用,它不会创建新数组。现在,如果您更改任何数据matrix1
或matrix2
更改将应用于两个列表。
但是如果您使用切片操作,它将创建一个新列表matrix2 = matrix1[:]
。现在,如果您更改任何数据matrix2
或matrix1
更改将分别应用。
注意:切片操作产生列表的浅拷贝。
matrix2[0][0] = x
这将在两个列表中发生变化,因为浅拷贝浅拷贝仅适用于一个级别,例如matrix2[0] = [x,y]
.
如果您不想更改数据,则可以使用deepcopy
. 它递归地复制每个对象。
推荐阅读
- jquery - CakePHP:计算整个表格的总数
- scikit-learn - sklearn 随机森林 sample_weight in fit()
- reactjs - 如何从快速服务器开始运行反应脚本?
- vba - 为什么这段代码没有给出任何重复项?
- node.js - 通过 ACM 和负载均衡器为 aws Nodejs 弹性 beanstalk 设置了 HTTPS,我如何在 s3 存储桶中为 Angular 设置 HTTPS
- list - *SwiftUI Beta 7* 如何使 ForEach 循环中的项目处于活动状态
- python - 尝试从 JSON 获取数据时出现 TypeError
- html - 将页脚放在页面末尾。引导程序
- amazon-web-services - 当 s3 数据存储同时具有 json 和 .gz 压缩文件时,如何通过 Glue 爬虫创建 AWS Athena 表?
- javascript - 添加 jest.mock 时的不变违规