python的浅拷贝和深拷贝
2018-12-13 本文已影响0人
好遠
python中提供了copy这个模块来对变量进行浅拷贝和深拷贝。
浅拷贝
python 中变量有三个重要的属性,id(内存地址),值和类型。
浅拷贝就是创建一个新id的变量,它的值和类型和拷贝对象的相同。
当值中存在对其他对象的引用时,原变量和新变量的值中的引用对象其实是指向同一个东西,无论修改a还是b,这个引用都同时改变。
例如
import copy
a = [1, 2, 3, ['a', 'b']]
b = copy.copy(a)
# a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
print ("修改a:")
a[3].append('c')
print ("a: %s" % a)
print ("b: %s" %b)
print ("修改b:")
print ("a: %s" % a)
b[3].append('d')
print ("a: %s" % a)
print ("b: %s" %b)
输出:
>>> import copy
>>> a = [1, 2, 3, ['a', 'b']]
>>> b = copy.copy(a) # 浅拷贝
>>> # a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
>>> print ("修改a:")
修改a:
>>> a[3].append('c')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("修改b:")
修改b:
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> b[3].append('d')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c', 'd']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b', 'c', 'd']]
深拷贝
与浅拷贝不同,深拷贝会递归查找变量的值中更深层的引用,实现深层次的拷贝,因此不用担心新变量值的改变影响到原变量的值。
例子:
import copy
a = [1, 2, 3, ['a', 'b']]
b = copy.deepcopy(a)
# a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
print ("修改a:")
a[3].append('c')
print ("a: %s" % a)
print ("b: %s" %b)
print ("修改b:")
print ("a: %s" % a)
b[3].append('d')
print ("a: %s" % a)
print ("b: %s" %b)
输出:
>>> import copy
>>> a = [1, 2, 3, ['a', 'b']]
>>> b = copy.deepcopy(a) # 深拷贝
>>> # a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
>>> print ("修改a:")
修改a:
>>> a[3].append('c')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b']]
>>> print ("修改b:")
修改b:
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> b[3].append('d')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b', 'd']]