Python字典遍历的陷阱
2021-12-02 09:43
1006 查看
众所周知,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)
参考文献
- [1] Marfoq O, Neglia G, Bellet A, et al. Federated multi-task learning under a mixture of distributions[J]. Advances in Neural Information Processing Systems, 2021, 34.
- [2] https://github.com/omarfoq/FedEM
相关文章推荐
- Python中元组、列表、字典的遍历和相互转化
- python-字典遍历
- python字典的陷阱
- Python学习-字典遍历
- Python -- 遍历字典时删除元素报异常
- Python中实现按顺序遍历字典
- python之 序列与字典遍历
- Python遍历字典dict的几种方法
- python基础总结二:判断语句、循环语句、字符串遍历、以及列表、元组、字典的简单使用 。
- Python多维/嵌套字典数据无限遍历
- python3 字典遍历操作
- Python实现字典的遍历与排序功能示例
- Python自学之路第八步——遍历字典&嵌套
- python字典遍历的几种方法
- python两种遍历字典(dict)的方法比较
- Python中使用item()方法遍历字典的例子
- python学习之——字典的遍历
- Python多维/嵌套字典数据无限遍历
- python中字典dic详解-创建,遍历和排序
- python字典的遍历与排序