路漫漫其修远兮,吾将上下而求索。

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

python中的深浅拷贝问题

1.浅拷贝

1.1 对于无嵌套类型的浅复制

L = [1, 'Tom', '成都']
L1 = L.copy()    # 内存地址不一样

L[1] = '上海'
L1[2] = 'Hello'
L1.append('##')

print(L)    # [1, '上海', '成都']
print(L1)   # [1, 'Tom', 'Hello', '##']

1.2 对于有嵌套类型的浅复制

L = [1, 'Tom', [22, '成都']]
L1 = L.copy()   # 外层内存地址不一样,嵌套部分的内存地址一样

L1[2][0] = 'Hello'
L[2].append('##')

print(L)    # [1, 'Tom', ['Hello', '成都', '##']]
print(L1)   # [1, 'Tom', ['Hello', '成都', '##']]

2.深复制

​ 跟浅复制不一样的是,深复制不仅复制了内存空间的内容,更复制了内存空间后的指向,即通过深复制后的两个列表没有一点儿关联关系

import copy
L = [1, 'Tom', [22, '成都']]
L1 = L.deepcopy()   # 外层和嵌套内层的内存地址都不一样

L1[2][0] = 'Hello'
L[2].append('##')

print(L)    # [1, 'Tom', [22, '成都', '##']]
print(L1)   # [1, 'Tom', ['Hello', '成都']]

3.总结:

无论对于深拷贝还是浅拷贝,对于无嵌套的列表来说,对拷贝前的源列表或拷贝后的新列表的修改都不应该另一个列表的元素;而对于有嵌套的列表的来说,浅拷贝对嵌套列表的修改将影响两个列表的值;深拷贝则不影响。

浅拷贝:嵌套的可变数据类型是同一个

深拷贝:嵌套的可变数据类是不是同一个

4.赋值运算和切片

L = [1, '#', ['Tom', '上海']]
L1 = L          # 内存地址一模一样

L[1] = 4
del L1[2][0]

print(L)   # [1, 4, ['上海']]
print(L1)  # [1, 4, ['上海']]

2.切片

# 切片等同于浅复制
L = [1, '#', ['Tom', '上海']]
L1 = L[:]  # 外层内存地址不一样,嵌套部分内存地址一样
print(id(L))    # 139780854130760,外层内存地址不一样
print(id(L1))   # 139780854131016

print(id(L[2]))   # 139780855161544,嵌套部分内存地址一样
print(id(L1[2]))  # 139780855161544

L[1] = 4 
print(L)        # [1, 4, ['Tom', '上海']]
print(L1)       # [1, '#', ['Tom', '上海']]

del L1[2][0]    
print(L)       # [1, 4, ['上海']]
print(L1)      # [1, '#', ['上海']]

posted on   rushiy  阅读(259)  评论(0编辑  收藏  举报

编辑推荐:
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
阅读排行:
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡
点击右上角即可分享
微信分享提示