python之深浅拷贝

list1 = ['egon','lxx',[1,2]]
#二者分隔不开,liist1改list2也跟着改,因为指向的就是同一个内存地址
list2 = list1   # 这不叫拷贝
list1[0] ='EGON'
print(list2)

需求:
1.拷贝一下原列表产生一个新的列表
2.想让两个列表完全独立开,针对改操作的独立而不是读操作

3.如何拷贝列表
3.1 浅拷贝 是把列表第一层的内存地址不加区分玩玩拷贝一份给新列表

实验一:
list1 = ['egon','lxx',[1,2]]
list2 = list1.copy()
print(list2)
print(id(list1),id(list2))
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))

实验二、
list1[0]='EGON'
list1[1]='LXX'
#对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,即原列表的索引指向原来的内存地址,于是新列表也跟着一起变
list1[2][0]=111
list1[2][1]=222
print(list1)
print(list2)

综合前面两个实验可以得出,要想copy得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy
3.2深copy

import copy
list1 = ['egon','lxx',[1,2]]
list3 = copy.deepcopy(list1)
print(id(list1),id(list3))
print(list3)
            # 不可变    不可变      可变
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
print(id(list1[2][1])
print(id(list3[2][1])
#
list1[0] = 'EGON'
list1[1] = 'LXX'
list1[2][0] = 111
list1[2][1] = 222
print(list1)
print(list3)
Python中的深拷贝和浅拷贝是用于复制对象的两种不同方式。 浅拷贝是创建一个新的对象,该对象与原始对象共享内部数据的引用。换句话说,浅拷贝只复制了对象的引用,而不是实际的数据。这意味着如果原始对象中的数据发生变化,浅拷贝的对象也会受到影响。 Python中可以使用copy模块的copy()函数来进行浅拷贝。另外,对于可变对象(如列表、字典等),还可以使用切片操作或者工厂函数(如list()、dict()等)来进行浅拷贝。 以下是浅拷贝的示例代码: ```python import copy # 列表的浅拷贝 list1 = [1, 2, [3, 4]] list2 = copy.copy(list1) list1[2][0] = 5 print(list1) # 输出:[1, 2, [5, 4]] print(list2) # 输出:[1, 2, [5, 4]] # 字典的浅拷贝 dict1 = {'a': 1, 'b': [2, 3]} dict2 = copy.copy(dict1) dict1['b'][0] = 4 print(dict1) # 输出:{'a': 1, 'b': [4, 3]} print(dict2) # 输出:{'a': 1, 'b': [4, 3]} ``` 深拷贝是创建一个新的对象,该对象与原始对象完全独立,包括内部数据的引用。换句话说,深拷贝会递归地复制所有的数据,而不仅仅是引用。这意味着即使原始对象中的数据发生变化,深拷贝的对象也不会受到影响。 Python中可以使用copy模块的deepcopy()函数来进行深拷贝。 以下是深拷贝的示例代码: ```python import copy # 列表的深拷贝 list1 = [1, 2, [3, 4]] list2 = copy.deepcopy(list1) list1[2][0] = 5 print(list1) # 输出:[1, 2, [5, 4]] print(list2) # 输出:[1, 2, [3, 4]] # 字典的深拷贝 dict1 = {'a': 1, 'b': [2, 3]} dict2 = copy.deepcopy(dict1) dict1['b'][0] = 4 print(dict1) # 输出:{'a': 1, 'b': [4, 3]} print(dict2) # 输出:{'a': 1, 'b': [2, 3]} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值