版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
通过例子来说明
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