赞
踩
一图胜千言,先上三幅小图,图片来源。
|
|
|
赋值是将一个对象指向一个已经存在的对象的过程,通常使用 = \texttt{=} = 来完成赋值操作。在 Python 中,当一个变量被赋值为另一个变量时,它们指向的是同一个对象。例如:
a = {1 : [1, 2, 3]}
b = a
# 赋值操作,就相当于C++里的引用,指向同一个对象
在上述赋值操作中变量 a
与 b
指向同一个对象。对其中任何一个变量进行修改都会影响另一个变量的值,如以下代码运行结果所示。
# 测试用
a = [1, 2, 3, ['a', 'b', 'c']]
b = a
a.append(4)
a[3].append('d')
print("a = ", a)
print("b = ", b)
# 测试结果
'''
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
b = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
'''
在 Python 中,可以使用切片操作或者 copy()
方法来进行浅拷贝。如下浅拷贝操作的代码。
浅拷贝操作创建一个对象,这个对象和原对象(被拷贝的对象)共享子对象的数据,仅仅是共享子对象的数据而不共享原对象的其他数据。也就是说对浅拷贝新创建的子对象进行一些操作会影响到原对象的子对象,对拷贝对象其他部分数据的操作不会影响到原对象其他部分数据。如下面测试代码所示:
# 浅拷贝 a = {1 : [1, 2, 3]} b = a.copy() # 测试用 a = [1, 2, 3, ['a', 'b', 'c']] b = a.copy() a.append(0) a[3].append('d') print("a = ", a) print("b = ", b) # 测试结果 ''' a = [1, 2, 3, ['a', 'b', 'c', 'd'], 0] b = [1, 2, 3, ['a', 'b', 'c', 'd']] '''
以上的浅拷贝操作中,a
、b
是一个独立的对象,但是他们的子对象还是指向同一个对象(引用),通过对以下代码的运行也可知。
深拷贝是创建一个新的对象,这个对象与原对象完全独立,即它们没有任何关系。在 Python 中,可以使用 copy.deepcopy() 方法来进行深拷贝。例如:
import copy
a = {1 : [1, 2, 3]}
b = copy.deepcopy(a)
# 测试用
import copy
a = [1, 2, 3, ['a', 'b', 'c']]
b = copy.deepcopy(a)
a.append(0)
a[3].append('a')
print("a = ", a)
print("b = ", b)
# 测试结果
'''
a = [1, 2, 3, ['a', 'b', 'c', 'a'], 0]
b = [1, 2, 3, ['a', 'b', 'c']]
'''
深拷贝操作,a
、b
分别拷贝了父对象及其子对象,二者都是完全独立的。因此,对变量 a
、b
分别操作不会相互影响。
值得注意的是使用深拷贝操作需要使用 copy
模块。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。