跳转至

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]都没有改变。

评论