Python字典遍历的陷阱
作者:Orion's?Blog 时间:2022-11-16 21:59:11
众所周知,Python
中常常按照key
、value
的形式来遍历字典的items
。若value
是基本数据类型(int,float等),则是传的拷贝,是不能直接修改value的:
dict2 = {'A':4, 'B':4}
for _, num in dict2.items():
num += 1
print(dict2) # {'A': 4, 'B': 4}
这种情况下,若要修改value
,只能按照my_dict[key] = ...
的形式来修改。
for key, num in dict2.items():
dict2[key] += 1
print(dict2) # {'A': 5, 'B': 5}
但是如果value
是一个列表或者自定义类的对象,那么传的是引用,是可以修改的
如下所示:
dict1 = {'A':[1,2,3,4],'B':[3,4,5,6]}
for _, indices in dict1.items():
indices.append(9)
print(dict1) # {'A': [1, 2, 3, 4, 9], 'B': [3, 4, 5, 6, 9]}
再如下面这个例子:
```python
class MyClass:
def __init__(self, value):
self.value = value
my_dict = dict([(i, MyClass(i)) for i in range(3)])
for _, my_obj in my_dict.items():
print(my_obj.value)
print('\n')
for _, my_obj in my_dict.items():
my_obj.value += 1
for _, my_obj in my_dict.items():
print(my_obj.value)
最后打印输出:
0
1
2
1
2
3
也就是说,python
中字典按照key
、value
遍历的时候value
实际上相当于函数的参数,它会按照函数的参数传递规则进行传递,即对基本数据类型传拷贝,对于对象传引用。
value对于对象传引用有许多好处,比如我们可以将numpy.random.shuffle()
作用于做为字典value的列表,使该列表被打乱:
import random
dict1 = {'A':[1,2,3,4],'B':[3,4,5,6]}
for _, indices in dict1.items():
random.shuffle(indices)
print(dict1) # {'A': [4, 1, 3, 2], 'B': [4, 5, 6, 3]}
这个例子是我研究论文[1]的开源代码[2]时发现的,论文中用下列代码将每个cluster
对应的样本索引列表打乱:
for _, cluster in clusters.items():
rng.shuffle(cluster)
另外,该论文也使用下列代码将全局模型的各分量模型拷贝到各client模型:
for learner_id, learner in enumerate(client.learners_ensemble):
copy_model(learner.model, self.global_learners_ensemble[learner_id].model)
来源:https://www.cnblogs.com/orion-orion/p/15631854.html
标签:Python,字典,遍历,陷阱
0
投稿
猜你喜欢
Python中使用中文的方法
2021-09-26 05:46:39
Mysql Error Code : 1436 Thread stack overrun
2024-01-23 14:04:04
使用python解析json字段的3种方式实例
2021-12-24 04:16:27
PyQt5 QSerialPort子线程操作的实现
2023-08-21 13:07:28
python 查找字符串是否存在实例详解
2023-09-22 21:31:17
python采集博客中上传的QQ截图文件
2021-03-03 16:45:25
Python Pillow(PIL)库的用法详解
2022-01-31 13:43:26
js中eval详解
2024-04-19 10:01:30
关于Python 中IndexError:list assignment index out of range 错误解决
2021-01-27 19:06:01
python 为什么说eval要慎用
2022-05-01 17:38:49
CentOS 7 下使用yum安装MySQL5.7.20 最简单方法
2024-01-29 11:13:06
Python 简单计算要求形状面积的实例
2022-10-19 09:02:33
asp sql去左右空格函数
2008-03-04 17:29:00
vue实现小球滑动交叉效果
2024-04-30 10:30:09
详解Numpy扩充矩阵维度(np.expand_dims, np.newaxis)和删除维度(np.squeeze)的方法
2023-02-13 22:24:24
vue实现Input输入框模糊查询方法
2024-04-28 09:20:46
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2024-01-14 06:54:35
Git的撤销、修改和回退命令
2022-12-05 14:10:12
利用OpenCV给彩色 图像添加椒盐噪声的方法
2023-06-15 00:11:30
详解python列表(list)的使用技巧及高级操作
2021-05-12 15:26:47