Python字典遍历的陷阱

 更新时间:2021年12月03日 08:42:36   作者:Orion's Blog  
这篇文章主要介绍了Python字典遍历的陷阱,我们都知道,Python中常常按照key、value的形式来遍历字典的items。若value是基本数据类型(int,float等),则是传的拷贝,是不能直接修改value的,下面来看看文章的详细内容吧

众所周知,Python中常常按照keyvalue的形式来遍历字典的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中字典按照keyvalue遍历的时候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)

到此这篇关于Python字典遍历的陷阱的文章就介绍到这了,更多相关Python字典遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python密码学对称和非对称密码教程

    python密码学对称和非对称密码教程

    这篇文章主要为大家介绍了python密码学对称和非对称密码教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python绘制分组条形图的示例代码

    python绘制分组条形图的示例代码

    本文主要介绍了如何使用python绘制分组条形图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • OpenCV实现机器人对物体进行移动跟随的方法实例

    OpenCV实现机器人对物体进行移动跟随的方法实例

    这篇文章主要给大家介绍了关于OpenCV实现机器人对物体进行移动跟随的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • python中的五种异常处理机制介绍

    python中的五种异常处理机制介绍

    这篇文章主要介绍了python中的五种异常处理机制介绍,本文是Learn Python一书的读书笔记,需要的朋友可以参考下
    2014-09-09
  • 浅谈怎么给Python添加类型标注

    浅谈怎么给Python添加类型标注

    今天给大家带来的文章是Python的相关知识,文章围绕着怎么给Python添加类型标注展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • python fuzzywuzzy模块模糊字符串匹配详细用法

    python fuzzywuzzy模块模糊字符串匹配详细用法

    这篇文章主要介绍了使用Python完成公司名称和地址的模糊匹配的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python KNN算法实现鸢尾花数据集分类

    python KNN算法实现鸢尾花数据集分类

    这篇文章主要介绍了python KNN算法实现鸢尾花数据集分类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Apache如何部署django项目

    Apache如何部署django项目

    这篇文章主要介绍了Apache如何部署django项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python中使用 Selenium 实现网页截图实例

    Python中使用 Selenium 实现网页截图实例

    这篇文章主要介绍了Python中使用 Selenium 实现网页截图实例,Selenium支持Java、C#、Ruby 以及 Python等语言,本文以Python语言为例,需要的朋友可以参考下
    2014-07-07
  • 使用numpy查找元素位置numpy.where

    使用numpy查找元素位置numpy.where

    这篇文章主要介绍了使用numpy查找元素位置numpy.where问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论