当前位置:   article > 正文

Python之赋值、深拷贝与浅拷贝_python赋值和浅拷贝

python赋值和浅拷贝

一图胜千言,先上三幅小图,图片来源

赋值操作
浅拷贝操作
深拷贝操作

赋值操作

赋值是将一个对象指向一个已经存在的对象的过程,通常使用 = \texttt{=} = 来完成赋值操作。在 Python 中,当一个变量被赋值为另一个变量时,它们指向的是同一个对象。例如:

a = {1 : [1, 2, 3]}
b = a
# 赋值操作,就相当于C++里的引用,指向同一个对象
  • 1
  • 2
  • 3

在上述赋值操作中变量 ab 指向同一个对象。对其中任何一个变量进行修改都会影响另一个变量的值,如以下代码运行结果所示。

# 测试用
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]
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

浅拷贝

在 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']]
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

以上的浅拷贝操作中,ab 是一个独立的对象,但是他们的子对象还是指向同一个对象(引用),通过对以下代码的运行也可知。

深拷贝

深拷贝是创建一个新的对象,这个对象与原对象完全独立,即它们没有任何关系。在 Python 中,可以使用 copy.deepcopy() 方法来进行深拷贝。例如:

import copy
a = {1 : [1, 2, 3]}
b = copy.deepcopy(a)
  • 1
  • 2
  • 3
# 测试用
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']]
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

深拷贝操作,ab 分别拷贝了父对象及其子对象,二者都是完全独立的。因此,对变量 ab 分别操作不会相互影响。
值得注意的是使用深拷贝操作需要使用 copy 模块。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/71468
推荐阅读
相关标签
  

闽ICP备14008679号