python 深浅copy

                                            强大自己是唯一获得幸福的途径,这是长远的,而非当下的玩乐!


浅copy

先来看一下在字典以及列表中的copy方法

# 列表
>>> l1 = [1, 2, 3, "zw", "lp", ["op", "python"]]
>>> l2 = l1.copy()
>>> print("{}\n{}".format(l1, l2))
[1, 2, 3, 'zw', 'lp', ['op', 'python']]
[1, 2, 3, 'zw', 'lp', ['op', 'python']]

# 字典等同列表操作
>>> dic1 = {"name": "zw", "age": 18, "work": {"加功能": 10, "改功能": 30, "出BUG": -50}}
>>> dic2 = dic1.copy()
>>> print("{}\n{}".format(dic1, dic2))
{'name': 'zw', 'age': 18, 'work': {'加功能': 10, '改功能': 30, '出BUG': -50}}
{'name': 'zw', 'age': 18, 'work': {'加功能': 10, '改功能': 30, '出BUG': -50}}

# 操作一样,所以下面操作都为列表

上面不是已经copy出来了吗?为什么会有深浅copy呢?请看下面操作 

>>> l1[-1].append("csdn")
>>> print("{}\n{}".format(l1, l2))
[1, 2, 3, 'zw', 'lp', ['op', 'python', 'csdn']]
[1, 2, 3, 'zw', 'lp', ['op', 'python', 'csdn']]

可以看到在列表l1内还有一个列表,当只操作了l1内的列表时,l2也随之改变了,这是为什么呢?我们先来id看一下内存地址是否一致

>>> id(l1)
4539874952
>>> id(l2)
4540093128
>>> id(l1[-1])
4540072264
>>> id(l2[-1])
4540072264

# 注: 使用=号是一个赋值操作而非copy,如下
>>> l2 = l1
>>> id(l1)
4539874952
>>> id(l2)
4539874952

可以看到第一层的列表是新开辟了内存地址,但是其内的列表从第二层开始,及更深层的包含的列表来说则重复使用了,但在某些场景下,我们需要他们完全独立,所以就有了下面的深copy

深copy-deepcopy

>>> l1 = [1, 2, 3, 'zw', 'lp', ['op', 'python', 'csdn']]
>>> l2 = copy.deepcopy(l1)
>>> print("{}\n{}".format(id(l1[-1]), id(l2[-1])))
4540093512
4540093128

可以明显的看到内层的列表也是重新生成的内存地址,我们来更改一下试试吧

>>> del l2[-1][-1]
>>> print("{}\n{}".format(l1,l2))
[1, 2, 3, 'zw', 'lp', ['op', 'python', 'csdn']]
[1, 2, 3, 'zw', 'lp', ['op', 'python']]
>>> print("{}\n{}".format(id(l1[-1]), id(l2[-1])))
4540093512
4540093128

可以看到我们删除了列表l2内列表的最后一个csdn元素,l1并未随之改变。

所以对于深copy来说,两个对象是完全独立的,改变任意其一的任何元素包括其内更深层的元素,另一个也不会改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值