Python列表赋值,深拷贝浅拷贝

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_29720657/article/details/102733888

通过例子来说明

a =[1,2,3,4,5,6,7]
b = a
print(b) #等于a
a[0] = 0 #a变了
print(b) #b也变

输出

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

解释:[1,2,3,4,5,6,7]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变

如果希望a不改变。

可用切片,把b = a ,改为 b = a[:]

a =[1,2,3,4,5,6,7]
b = a[:]
print(b) #等于a
a[0] = 0 #a变了
print(b) #b也不变

输出:

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

解释:切片a[:]会产生一个新的对象,占用一块新的内存,b指向这个新的内存区域,因此改变a所指向的对象的值,不会影响b

浅拷贝与深拷贝

浅拷贝,b = copy.copy(a)

例子:

import copy
a =[1,2,3,4,[5,6,7]]
b = copy.copy(a)
print(b) #等于a
a[4].append('a') #a变了(a变的时候不能用赋值语句,刚开始在这里栽跟头了)
print(b) #b也变

输出

[1, 2, 3, 4, [5, 6, 7]] #变之前,b = a
[1, 2, 3, 4, [5, 6, 7, 'a']] #变之后,b也变

深拷贝,b = copy.deepcopy(a)

import copy
a =[1,2,3,4,[5,6,7]]
b = copy.deepcopy(a)
print(b) #等于a
a[4].append('a') #a变了(a变的时候不能用赋值语句,刚开始在这里栽跟头了)
print(b) #b不变

输出

[1, 2, 3, 4, [5, 6, 7]] #变之前,b = a
[1, 2, 3, 4, [5, 6, 7]] #a变之后,b不变

拷贝也就是开辟一块新的内存空间,把被拷贝对象中的值复制过去。而浅拷贝并没有为子对象[5,6,7]开辟一块新的内存空间,而仅仅是实现对a中[5,6,7]的引用。所以改变a中[5,6,7]的值,b中的值也会发生变化。

深拷贝则是为子对象也开辟了一块新空间。所以改变a中[5,,6,7]的值,并不影响b

猜你喜欢

转载自blog.csdn.net/qq_29720657/article/details/102733888