Python中赋值、浅拷贝与深拷贝的区别详解
本文详细解析Python中变量赋值、浅拷贝(list.copy)与深拷贝(copy.deepcopy)的行为差异。通过列表、字典及字符串示例,展示不同操作对内存地址的影响。重点说明浅拷贝仅复制第一层对象,嵌套对象共享引用;而深拷贝则完全独立,修改任一副本不影响另一方。
Python变量赋值与内存关系
一、赋值对比
1、列表
l1 = [1,2,3]
l2 = l1
l1.append('a')
print(l1,l2) #[1, 2, 3, 'a'] [1, 2, 3, 'a']
print(id(l1),id(l2)) #43499848 43499848
#可以看到两个列表的值以及id值相同,对应的是同一个内存地址
2、字典
dic = {'name':'barry'}
dic1 = dic
dic['age'] = 18
print(dic,dic1) #{'name': 'barry', 'age': 18} {'name': 'barry', 'age': 18}
print(id(dic),id(dic1)) #31157344 31157344
#可以看到两个字典的值以及id值相同,对应的是同一个内存地址
3、字符串
s = 'alex'
s1 = s
s2 = s.replace('a','A')
print(s,s1,s2) #alex alex Alex
print(id(s),id(s1),id(s2)) #31040208 31040208 31040376
#赋值是同一个内存地址,替换字符串后的变量s2是另外的地址
浅拷贝与深拷贝机制解析
二、深浅copy
1、浅copy
在浅拷贝操作中,第一层数据会创建新的内存地址,但从第二层开始,内部元素仍指向原有的内存地址。因此,对于第二层及更深层次的数据结构,修改其中一个对象的内部元素,另一个对象也会随之改变,保持引用一致性。
# 1、普通浅copy
l1 = [1,2,3,4]
l2 = l1.copy()
l1.append('a')
print(l1,l2) #[1, 2, 3, 4, 'a'] [1, 2, 3, 4]
print(id(l1),id(l2)) #37077320 37078664
#id内存地址不一样,创建了两个地址空间,一个改变,另一个不会变化
# 2、嵌套浅copy
import copy
l1 = [1,[22,33,44],3,4,]
l2 = copy.deepcopy(l1)
# 改变第一层
l1[0] = 111
print(l1,l2) #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
# 改变第二层
l1[1].append('a')
print(l1,l2) # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
2、 深copy.deepcopy()
深拷贝(deepcopy)会递归地复制所有层级的数据,生成两个完全独立的对象。无论修改哪一方的任何层级元素,另一方都不会受到任何影响,两者在内存中完全隔离。
import copy
l1 = [1,[22,33,44],3,4,]
l2 = copy.deepcopy(l1)
# 改变第一层
l1[0] = 111
print(l1,l2) #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
# 改变第二层
l1[1].append('a')
print(l1,l2) # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2)) #43238536 43239048
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













