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'}

各种拷贝方式对比

方式 创建新字典 嵌套值独立
= 赋值
copy()
dict()
{**d}
deepcopy()

代码示例

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 的值。不修改原始字典。

标签: 字典方法 copy() 浅拷贝 深拷贝 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python字典fromkeys()方法 下一篇: Python字典clear()方法

poll相关推荐