Python字典深浅拷贝与循环方式方法详解

  • Post category:Python

Python字典深浅拷贝与循环方式方法详解

一、深浅拷贝

在Python中,复制一个字典有两个方法,分别是深拷贝和浅拷贝。所谓深拷贝,是指在内存中完完全全地重新再开辟一块儿位置,用来拷贝原始数据,而不是原地修改。浅拷贝,是指在原对象所在的位置上,重新创建一个新的标签用来拷贝原始数据。

  1. 浅拷贝

浅拷贝时,我们可以使用 copy() 方法。

例如:

dict1 = {'name': '小明', 'age': 18, 'sex': 'male'}
dict2 = dict1.copy()

这时候我们把两个字典的内存地址打印出来看看:

print(id(dict1), id(dict2))

我们会发现两个字典的内存地址不一样,即两个字典占用的是两块内存空间。

  1. 深拷贝

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 也不会受到影响。