python列表--浅拷贝与深拷贝的区别

首先得说说列表为什么需要拷贝,就是为了解决简单赋值操作,传地址的问题,因为赋值过去的列表,其实指向的是同一个地址,问题说明看代码

a = [1,2,3]
b = a
# list类型,简单赋值操作,是传地址
print(id(a))
print(id(b))
b[1] = 6
print(b)
print(a)
执行结果,输出的是:
2460317409864 
2460317409864
[1, 6, 3]
[1, 6, 3]
#同一地址,修改b的列表,a也会同时改变。

为了解决以上问题,list赋值需要采用copy函数

a = [1,2,3]
b = a.copy()
print(id(a))
print(id(b))
b[1] = 6
print(b)
print(a)

但是由于copy只是浅拷贝,其只拷贝一层

深拷贝跟浅拷贝的区别

# 出现下列问题的原因是,copy‘函数是个浅拷贝函数,即只拷贝一层内容
# 深拷贝需要使用copy模块
a = [1,2,3,[10,20,30]]
b = a.copy()
print(id(a))
print(id(b))
print('*' * 20)
print(id(a[3]))
print(id(b[3]))
a[3][2]=666
print(a)
print(b)
以上代码输出结果为:
2963694903944
2964112968904
********************
2963694903880
2963694903880
[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 666]]

接下来演示一下深拷贝

import copy
a = [1,2,3,[10,20,30]]
b = copy.deepcopy(a)  #这里不一样哦
print(id(a))
print(id(b))
print('*' * 20)
print(id(a[3]))
print(id(b[3]))
a[3][2]=666
print(a)
print(b)
#输出结果:
2620494013064
2620883635400
********************
2620494013000
2620495283144
[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 30]]
#这才是我们想要得到的目的

不明白的可以自己实践操作试试

猜你喜欢

转载自blog.51cto.com/14113984/2429087
今日推荐