Python字典深浅拷贝与循环方式方法详解
一、深浅拷贝
在Python中,复制一个字典有两个方法,分别是深拷贝和浅拷贝。所谓深拷贝,是指在内存中完完全全地重新再开辟一块儿位置,用来拷贝原始数据,而不是原地修改。浅拷贝,是指在原对象所在的位置上,重新创建一个新的标签用来拷贝原始数据。
- 浅拷贝
浅拷贝时,我们可以使用 copy() 方法。
例如:
dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
dict2 = dict1.copy()
这时候我们把两个字典的内存地址打印出来看看:
print(id(dict1), id(dict2))
我们会发现两个字典的内存地址不一样,即两个字典占用的是两块内存空间。
- 深拷贝
Python 中,深拷贝的实现需要使用到 copy 模块中的 deepcopy() 方法。
例如:
import copy
dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
dict2 = copy.deepcopy(dict1)
这时候我们把两个字典的内存地址打印出来看看:
print(id(dict1), id(dict2))
我们会发现两个字典的内存地址不一样,即两个字典占用的是两块内存空间。
二、循环方式
循环方式有以下几种:
1. 遍历所有键
dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
for key in dict1.keys():
print(key)
2. 遍历所有值
dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
for value in dict1.values():
print(value)
3. 遍历所有键值对
dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
for key, value in dict1.items():
print(key, value)
三、示例说明
示例一
import copy
dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
dict2 = dict1.copy()
dict2['age'] = 20
print(dict1)
print(dict2)
运行结果:
{'name': '小明', 'age': 18, 'sex': 'male'}
{'name': '小明', 'age': 20, 'sex': 'male'}
我们发现,使用了浅拷贝之后,当我们修改 dict2 中的值时,dict1 并没有随之改变。
示例二
import copy
dict1 = {'name': '小明', 'age': 18, 'sex': 'male', 'education': ['本科', '硕士']}
dict2 = copy.deepcopy(dict1)
dict2['education'][0] = '研究生'
print(dict1)
print(dict2)
运行结果:
{'name': '小明', 'age': 18, 'sex': 'male', 'education': ['本科', '硕士']}
{'name': '小明', 'age': 18, 'sex': 'male', 'education': ['研究生', '硕士']}
我们发现,当我们使用深拷贝的方法来拷贝 dict1 时,即使 dict2 中的列表类型的 value 发生变化,dict1 也不会受到影响。