python deepcopy 丢失_python 引用、copy 与deepcopy

一、引用

a=[1,2,3]

b=a

此为列表引用,a和b的内存地址是一样的,都是指向列表[1,2,3]。其实是一个列表,两个名字。操作其中一个变量改变列表,另外一个变量显示的列表也同时改变。

a=[1,2,3]

b=aprint(id(a))print(id(b))

输出:

2132799892168

2132799892168

a.append(4)print(b)

输出:

[1, 2, 3, 4]

deflis(li):

li.append(4)

a=[1,2,3]

lis(a)print('a=',a)

输出:

a= [1, 2, 3, 4]

可以看到,即使函数没有返回值,列表a的内容也是被改变了。

这是因为不管变量名有多少个,列表其实只有一个。通过任意一个变量名对列表进行操作,列表改变,不管通过哪一个变量名引用列表的内容自然也发生改变。

引用与C语言的指针非常相像。

举个例子:一个人有两个名字张三、李四。如果张三中了500万,那么李四肯定中了500万。李四有1000万财产,张三肯定也有1000万财产。

此处,这个人就相当于列表。张三、李四这两个名字相当于变量名,指向这个人。这个人还可以叫王五、赵六。只要一个名字对应的这个人发生了改变,引用其余的名字时,这个人必然发生了同样的改变。

由于引用是对一个列表进行操作,列表会随着操作进行改变,无法保存原列表。

二、deepcopy

importcopy

a=[1,2,[1,3]]

b=copy.deepcopy(a)print(id(a))print(id(b))print(id(a[2]))

print(id(b[2]))

输出:2599508758664

2599508759880

22393634322642239363470600

a、b的内存地址已经完全不一样,a、b指向的列表完全相互独立,是两个完全不同的列表,相互之间不再存在影响。

三、copy

copy是介于引用和deepcopy之间的一种模式。

对于最外层的列表,相当于deepcopy,相互独立。

但是对于嵌套的列表,他相当于引用

a=[1,2,[1,3]]

b=a.copy()print(id(a))print(id(b))print(id(a[2]))print(id(b[2]))

输出结果:3166059548808

3166059550024

3166059511624

3166059511624

可以看到,对于a、b这两个变量,他们的内存地址是不一样的,相互独立

但是对于嵌套列表a[2]、b[2]来说,内存地址是一样的,是对同一个列表的引用。

同样,对于一个列表a添加一个列表b作为元素,则该元素也会随着列表b的变化而变化

a=[1,2,3]

b=[4,5,6]

a.append(b)

b[0]=0print(a)

输出:

[1, 2, 3, [0, 5, 6]] #可以看到,当b改变后,a[3]也随之改变

若想相互独立,由于b中元素不含有列表,此处可以用copy:

a=[1,2,3]

b=[4,5,6]

a.append(b.copy())

b[0]=0print(a)

输出:

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

如果b中同样嵌套列表,则需要用deepcopy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,`copy`和`deepcopy`都是用于复制对象的函数,但它们之间有一些区别。 `copy`是浅拷贝,它创建了一个新的对象,但是这个新对象仍然与原对象共享内部嵌套对象的引用。换句话说,新对象中的某些内部对象实际上是原对象中相同的对象。当你修改一个嵌套对象时,这个改变也会反映在其他拷贝中。 `deepcopy`是深拷贝,它创建了一个全新的对象,并且递归地复制原始对象及其所有嵌套对象。这意味着新对象与原对象以及其嵌套对象完全独立,对其中一个对象的任何改变都不会影响其他对象。 具体来说,`copy`只复制了原始对象的引用,而没有复制对象自身。而`deepcopy`创建了一个全新的对象,并且递归地复制所有嵌套对象。 下面是一个简单的示例来展示它们之间的区别: ```python import copy # 原始列表 original_list = [[1, 2, 3], [4, 5, 6]] # 浅拷贝 shallow_copy = copy.copy(original_list) # 深拷贝 deep_copy = copy.deepcopy(original_list) # 修改原始列表的第一个元素 original_list = 10 print(original_list) # 输出: [[10, 2, 3], [4, 5, 6]] print(shallow_copy) # 输出: [[10, 2, 3], [4, 5, 6]] print(deep_copy) # 输出: [[1, 2, 3], [4, 5, 6]] ``` 在上面的示例中,原始列表被修改后,浅拷贝和原始列表都发生了改变,而深拷贝保持了不变。这是因为浅拷贝只复制了嵌套列表的引用,而深拷贝创建了一个新的嵌套列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值