好友
阅读权限10
听众
最后登录1970-1-1
|
浅拷贝和深拷贝
浅拷贝:不拷贝子对象的内容,只是拷贝值对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。
[Python] 纯文本查看 复制代码 import copy #引入copy模块def testcopy():
'''测试浅拷贝'''
a = [10,20,[5,6]]
b = copy.copy(a)
print('a:',a)
print('b:',b)
b.append(30)
b[2].append(5)
print('浅拷贝后.....')
print(a)
print(b)
print(id(a[2]))
print(id(b[2]))
testcopy()
测试结果为:a: [10, 20, [5, 6]]
b: [10, 20, [5, 6]]
浅拷贝后.....
[10, 20, [5, 6, 5]]
[10, 20, [5, 6, 5], 30]
2012720260864
2012720260864
从结果我们可以看出,因为浅拷贝只是拷贝值对象的引用,函数运行完毕之后,a和b的值都发生了变化,首先将“10”,”20”,”[5,6]”这三个对象的地址赋给了a,然后b拷贝a,生成了一个新的地址,并且将“10”,”20”,”[5,6]”这3个对象分别指向b,第一步先是在b尾部加一个对象“30”,因为b和a内存地址不同,所以a不会发生变化,第二步在a[2]尾部增加一个对象“5”,而a和b中的a[2]都是指向一个地址,在a[2]中增加对象同样也会对a有效,因此a的值就会变成[10, 20, [5, 6, 5]]。
[Python] 纯文本查看 复制代码 import copy #引入copy模块
def testdeepcopy():
'''测试深拷贝'''
a = [10,20,[5,6]]
b = copy.deepcopy(a)
print('a:',a)
print('b:',b)
b.append(30)
b[2].append(5)
print('深拷贝后.....')
print(a)
print(b)
print(id(a[2]))
print(id(b[2]))
testdeepcopy()
运行结果为:a: [10, 20, [5, 6]]
b: [10, 20, [5, 6]]
深拷贝后.....
[10, 20, [5, 6]]
[10, 20, [5, 6, 5], 30]
2129750002944
2129750002368
这是一个深拷贝,从结果中可以看出,函数运行完毕后,a的值没有变。因为深拷贝会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象,会把a中所有子对象全部拷贝,全部生成新的内存地址,保存下来,这样对b的修改便不会对a造成影响。
|
免费评分
-
查看全部评分
|