Python 3 – 字典 copy() 方法
在Python中,字典(Dictionary)是一种非常常用的数据类型。字典常常用于存储无序的键值对。在Python 3中,字典提供了很多有用的方法,其中之一就是copy()方法。copy()方法用于创建一个字典的浅拷贝。本篇文章将讲解copy()方法的使用以及与深拷贝(deep copy)的区别。
copy()方法的基本用法
copy()方法用于创建一个字典的浅拷贝。浅拷贝指的是拷贝了字典的键值对,但没有拷贝键值对中的对象引用。这意味着,如果键值对中有对象类型的值,拷贝后的字典和原字典中的这些值仍然指向同一个对象。让我们看一个例子:
# 创建一个字典
original_dict = {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming']}
# 拷贝字典
copied_dict = original_dict.copy()
# 修改拷贝后的字典中的一个值
copied_dict['name'] = 'Jerry'
# 修改拷贝后的字典中的一个列表
copied_dict['hobbies'].remove('reading')
print(original_dict) # {'name': 'Tom', 'age': 18, 'hobbies': ['swimming']}
print(copied_dict) # {'name': 'Jerry', 'age': 18, 'hobbies': ['swimming']}
上面这段代码中,我们首先创建了一个字典original_dict。然后,我们使用copy()方法拷贝了原字典,并将拷贝后的字典赋值给了copied_dict。接下来,我们分别修改了拷贝后的字典中的一个值和一个列表。最后,我们分别打印了原字典和拷贝后的字典。可以看到,拷贝后的字典中对键 ‘name’和 ‘hobbies’的修改并没有影响原字典中的相应键值对。但是,我们在拷贝后的字典中修改列表(’hobbies’)时,却同时修改了原字典中的列表。这是因为拷贝的只是一个指向列表的引用,而不是列表的一个拷贝。
对象的引用
为了更好地理解上面那个例子,我们需要再深入地探讨一下“对象的引用”。
在Python中,一个对象的引用(Reference)就是对该对象内存地址的引用。在一个变量中,我们赋给它的值,实际上是这个值在内存中所占用空间的地址。这就意味着,当我们将变量a的值赋给变量b时,实际上是将变量a指向的内存地址赋给了变量b。这样,当我们修改b的值时,实际上是在修改a指向的内存地址中存储的值。
当我们将包含对象类型的值的键值对拷贝到一个新的字典中时,copy()方法只是将新字典中的键值对指向了同一个内存地址。这意味着,如果我们修改新字典中的对象类型值,它也会同时修改原字典中的相应值。
# 创建一个字典
original_dict = {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming']}
# 拷贝字典
copied_dict = original_dict.copy()
# 修改新字典中的列表
copied_dict['hobbies'].append('climbing')
print(original_dict) # {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming', 'climbing']}
print(copied_dict) # {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming', 'climbing']}
深拷贝
上面的例子中我们讲到了浅拷贝的概念。如果我们想要同时拷贝字典的所有值,包括对象类型的值,可以使用深拷贝(deep copy)。深拷贝指的是拷贝字典时,递归拷贝了字典中的所有对象。使用深拷贝,可以避免拷贝后字典中的对象值指向原字典中的相应对象值。要进行深拷贝,我们可以使用copy模块中的deepcopy()函数。
import copy
# 创建一个字典
original_dict = {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming']}
# 深拷贝字典
deep_copied_dict = copy.deepcopy(original_dict)
# 修改拷贝后的字典中的列表
deep_copied_dict['hobbies'].append('climbing')
print(original_dict) # {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming']}
print(deep_copied_dict) # {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'swimming', 'climbing']}
上面的例子中,我们使用了copy模块中的deepcopy()函数,对原字典进行了深拷贝。深拷贝后的字典中,键 ‘hobbies’所对应的列表已经与原字典中的列表无关联。这是因为,使用深拷贝,我们拷贝了列表对象的值,而不是列表对象的引用。
结论
Python 3的字典提供了copy()方法,用于创建一个字典的浅拷贝。使用copy()方法时需要注意,若原字典中包含对象类型的值,拷贝后的字典和原字典中的这些值仍然指向同一个对象。此外,我们还介绍了深拷贝的概念,以及使用copy模块中的deepcopy()函数实现深拷贝的方法。在使用字典时,尤其是涉及到对象类型值的键值对时,我们需要合理地选择拷贝方式,避免在修改新字典时不经意地修改原字典中的值。这是编写可靠的Python程序的基础。