python 浅拷贝和深拷贝

赋值语句 vs 浅拷贝

赋值语句(数据完全共享)

l1 = [randint(0, 100) for i in range(0, 10)]
l2 = l1
print(l1, l2)
l1[0] = 100
print(l1, l2)

通过赋值,l2 和l1指向同一个引用对象,改变l1的元素,l2也会改变
输出:

[48, 26, 48, 64, 73, 73, 84, 8, 63, 71] [48, 26, 48, 64, 73, 73, 84, 8, 63, 71]
[100, 26, 48, 64, 73, 73, 84, 8, 63, 71] [100, 26, 48, 64, 73, 73, 84, 8, 63, 71]

浅拷贝(数据半共享):

l1 = [randint(0, 100) for i in range(0, 10)]
l2 = copy(l1) #浅拷贝
print(l1, l2)
l1[0] = 100
print(l1, l2)

通过浅拷贝,l2 和l1指向不同的引用对象,改变l1子元素,并不会改变l2的元素
输出:

[16, 64, 82, 92, 44, 75, 37, 28, 68, 23] [16, 64, 82, 92, 44, 75, 37, 28, 68, 23]
[100, 64, 82, 92, 44, 75, 37, 28, 68, 23] [16, 64, 82, 92, 44, 75, 37, 28, 68, 23]

浅拷贝 VS 深拷贝

浅拷贝:

l3 = [0, [1, 2, 3], 4]
l4 = copy(l3)

print(l3, l4)
l3[1] = 5
print(l3, l4)

通过浅拷贝,l3 和 l4指向不同的引用对象,改变l3最上层的子元素,并不会改变l4的元素
输出:

[0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
[0, 5, 4] [0, [1, 2, 3], 4]

如果l3的某个子元素是可变引用对象,浅拷贝在拷贝时,只拷贝了最上层子元素的引用对象,最上层子元素对象里的子元素却指向同一个引用对象, 改变l3子元素的子元素会使得l4也发生改变

l3 = [0, [1, 2, 3], 4]
l4 = copy(l3)

print(l3, l4)
l3[1][0] = 5
print(l3, l4)

输出:

[0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
[0, [5, 2, 3], 4] [0, [5, 2, 3], 4]

深拷贝(数据完全不共享):
深拷贝会拷贝所有元素及其子元素的引用对象

l3 = [0, [1, 2, 3], 4]
l4 = deepcopy(l3)

print(l3, l4)
l3[1][0]= 5
print(l3, l4)

输出:

[0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
[0, [5, 2, 3], 4] [0, [1, 2, 3], 4]
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简单点说 copy.copy:浅拷贝 ,只拷贝父对象,不会拷贝对象的内部的子对象。(浅拷贝只是指拷贝原对象元素的引...
    MononokeHime阅读 238评论 0 1
  • 在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝...
    X_xxieRiemann阅读 445评论 0 0
  • 在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这...
    pure璞嵘阅读 308评论 0 0
  • Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。 copy.cop...
    那脸憔悴阅读 469评论 0 51
  • 今天继续为大家更新点东西,以前擅长写软文,用若干年物色来的溢美之词定位自己的价值观,铺成生活中的喜怒哀乐。只...
    陈流阅读 212评论 0 0

友情链接更多精彩内容