跳转至

Python 中的赋值与深浅拷贝

Python 中的赋值只是引用了对象,当原变量发生改变时,新变量也会随之发生改变。

.copy()方法可以进行浅拷贝,它可以深拷贝父对象(一级目录),但子对象(二级目录)仍然只是引用。

.deepcopy()方法可以进行深拷贝,它可以深拷贝父对象(一级目录)和子对象(二级目录),当原变量改变时,深拷贝得到的变量不会发生任何改变。

代码示例

导入copy包(仅在深拷贝时需要用到)

Python
import copy

创建带有二级目录的字典

Python
dict1 =  {'user':'runoob','num':[1,2,3]}

这里的数组[1,2,3]就是子对象(二级目录)。

赋值与深浅拷贝

Python
dict2 = dict1          # 浅拷贝:引用对象
dict3 = dict1.copy()   # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,子对象是引用
dict4 = copy.deepcopy(dict1) # 深拷贝:深拷贝父对象(一级目录)核子对象(二级目录)

修改原变量

Python
dict1['user']='root'
dict1['num'].remove(1)

查看赋值与深浅拷贝的结果是否改变

Python
# 输出结果
print("dict1", dict1)
print("dict2", dict2)
print("dict3", dict3)
print("dict4", dict4)
Python
dict1 {'user': 'root', 'num': [2, 3]}
dict2 {'user': 'root', 'num': [2, 3]} # (1)!
dict3 {'user': 'runoob', 'num': [2, 3]} # (2)!
dict4 {'user': 'runoob', 'num': [1, 2, 3]} # (3)!
  1. 赋值只是引用了对象,当原变量发生改变时,新变量也会随之发生改变。
  2. 浅拷贝中的父对象'user': 'runoob'没有发生改变,但'num': [1, 2, 3]也变成了'num': [2, 3]
  3. 深拷贝中的父对象'user': 'runoob''num': [1, 2, 3]都没有改变。

评论