Python中的赋值运算都是引用(即内存地址)的传递。对于可变类型来说,修改原数据的值,会改变赋值对象的值。
例子:
a = [11, 22]
b = [33, 44]
c = [a,b,‘hello’]
赋值是引用传递
d = c
c 和 d 指向的其实是同一个内存地址
print(c is d)
print© #[[11, 22], [33, 44], ‘hello’]
print(d) # [[11, 22], [33, 44], ‘hello’]
a.append(100)
c.append(‘hi’)
print© # [[11, 22, 100], [33, 44], ‘hello’, ‘hi’]
print(d) # [[11, 22, 100], [33, 44], ‘hello’, ‘hi’]
copy.copy()
浅拷贝:浅拷贝是对于一个对象的顶层拷贝;通俗的理解是:拷贝了引用,并没有拷贝内容。
切片其实是一种浅拷贝。
对于可变类型,会进行浅拷贝
对于不可变类型,不会拷贝,仅仅是指向
例子:
import copy
a = [11, 22]
b = [33, 44]
c = [a,b,‘hello’]
#copy 是浅拷贝,会把对象最上面的一层拷贝走
d = copy.copy©
#c 和 d 是两个不同的对象
print(c is d ) # False
#c[0] 和 d[0] 是同一个对象,浅拷贝只拷贝最上面的一层对象
print(c[0] is d[0]) # True
print(c[1] is d[1]) # True
print© # [[11, 22], [33, 44], ‘hello’]
print(d) # [[11, 22], [33, 44], ‘hello’]
#对象里的对象没有被拷贝走,所以修改对象内的对象时,会影响到d
a.append(100)
#最外层对象已经被拷贝走了,修改最外层对象里的数据,不会影响到d
c.append(‘hi’)
print© # [[11, 22, 100], [33, 44], ‘hello’, ‘hi’]
print(d) # [[11, 22, 100], [33, 44], ‘hello’]
copy.deepcopy()
深拷贝:深拷贝是对于一个对象所有层次的拷贝(递归)
例子:
import copy
a = [11, 22]
b = [33, 44]
c = [a,b,‘hello’]
#d 是对象c的深拷贝
d = copy.deepcopy©
#c 和 d是两个完全不同的对象
print(c is d) # False
#d里的每一个元素也都和c不同
print(c[0] is d[0])
print(c[1] is d[1])
print© #[[11, 22], [33, 44], ‘hello’]
print(d) #[[11, 22], [33, 44], ‘hello’]
a.append(100)
c.append(‘hi’)
print© #[[11, 22, 100], [33, 44], ‘hello’,‘hi’]
print(d) #[[11, 22], [33, 44], ‘hello’]