pin_drop当前位置:知识文库 ❯ 图文
Python字典copy()方法
概述
copy() 方法用于创建字典的浅拷贝。浅拷贝会创建一个新的字典对象,但字典中的值仍然是原字典中值的引用。对于嵌套字典和可变值对象,需要特别注意浅拷贝的共享引用问题。
语法
代码示例
dict.copy()返回值:字典的浅拷贝(新字典)
基本用法
代码示例
original = {"name": "Alice", "age": 25}
copied = original.copy()
print("原字典:", original)
print("副本:", copied)
print("是否同一对象:", original is copied)输出:
代码示例
原字典: {'name': 'Alice', 'age': 25}
副本: {'name': 'Alice', 'age': 25}
是否同一对象: False修改副本不影响原字典
代码示例
original = {"name": "Alice", "age": 25}
copied = original.copy()
copied["age"] = 26
print("原字典:", original)
print("副本:", copied)输出:
代码示例
原字典: {'name': 'Alice', 'age': 25}
副本: {'name': 'Alice', 'age': 26}浅拷贝的局限性
当字典的值是可变对象时,浅拷贝的值是共享的:
代码示例
original = {"scores": [90, 85, 92], "name": "Alice"}
copied = original.copy()
copied["scores"].append(88)
print("原字典:", original)
print("副本:", copied)输出:
代码示例
原字典: {'scores': [90, 85, 92, 88], 'name': 'Alice'}
副本: {'scores': [90, 85, 92, 88], 'name': 'Alice'}提示:修改副本中的列表,原字典也受影响!
深拷贝
代码示例
import copy
original = {"scores": [90, 85, 92], "name": "Alice"}
deep = copy.deepcopy(original)
deep["scores"].append(88)
print("原字典:", original)
print("深拷贝:", deep)输出:
代码示例
原字典: {'scores': [90, 85, 92], 'name': 'Alice'}
深拷贝: {'scores': [90, 85, 92, 88], 'name': 'Alice'}各种拷贝方式对比
代码示例
import copy
d = {"a": [1, 2], "b": [3, 4]}
b = d
c = d.copy()
e = dict(d)
f = {**d}
g = copy.deepcopy(d)
d["a"].append(99)
print("原字典:", d)
print("赋值:", b)
print("copy:", c)
print("dict():", e)
print("解包:", f)
print("deepcopy:", g)注意事项
提示:浅拷贝共享可变值:修改副本中的可变值会影响原字典。
提示:赋值不是拷贝:
b = d只是增加引用,不创建新字典。
提示:嵌套字典:嵌套字典中的子字典也是共享的,需要深拷贝才能完全独立。
小结
-
copy()创建字典的浅拷贝,返回新字典 -
浅拷贝的可变值与原字典共享
-
深拷贝使用
copy.deepcopy(),完全独立 -
=赋值不是拷贝,只是引用
常见问题
浅拷贝和深拷贝有什么区别?
浅拷贝只复制最外层对象,嵌套的可变对象仍然是共享引用。深拷贝递归复制所有层级,完全独立。
b = d 和 b = d.copy() 有什么区别?
b = d 只是增加引用,b 和 d 指向同一对象。b = d.copy() 创建新的字典对象,b 和 d 是独立对象。
如何深拷贝嵌套字典?
使用 copy 模块的 deepcopy() 函数:import copy; deep = copy.deepcopy(original)。
dict(d)、{**d} 和 d.copy() 有什么区别?
三者都是浅拷贝,效果相同。d.copy() 最直观,dict(d) 和 {**d} 是更 Pythonic 的写法。
练习1
给定嵌套字典 student = {"name": "Alice", "scores": {"math": 95, "english": 88}},创建一个深拷贝,修改拷贝中的数学成绩为 92,验证原字典未被修改。
练习2
编写一个函数 deep_merge(dict1, dict2),深度合并两个字典。如果两个字典有相同的键且值都是字典,则递归合并;否则用 dict2 的值覆盖 dict1 的值。不修改原始字典。
本文涉及AI创作
内容由AI创作,请仔细甄别