在Python3中,迭代字典时无需将值复制到局部变量,而只是将其复制为引用或指针?

时间:2018-06-30 16:50:12

标签: python python-3.x

我了解到可以有效地遍历字典而无需重新创建整个字典:

for k,v in iter(d.items()):
    print("k={} v={}".format(k,v))  # or do whatever. This is just placeholder code.

问:python3.5.4是否可以通过某种方式直接给我v值,作为指向它的指针或引用,而不是将其值复制到我的for循环中的局部变量v中?如果v是一个大数组,这可以为我提供帮助,因为每个v是一个numpy数组,在我的应用程序中包含10 ^ 5或10 ^ 6个元素,甚至更多,并且我的迭代器循环具有数百万次迭代。在其他语言中,我使用了引用和指针,但据我所知,我在python3.5.4中还没有使用它们。

感谢您分享专业知识。

更新:

这里是一些numpy python代码,我用来证明v不是本地副本,而是对numpy数组的引用。这对我来说是个好消息。这证实了获胜者的回答。感谢获胜者,以及所有其他评论者都声称相同。我对此感到高兴!再次感谢所有参加的人。

import numpy as np
x = np.array([8,6,7,5,3,0,9])
d = {}
d["mouse"] = x
for k,v in iter(d.items()):
    v[1] = 2
print(d)

词典现在在一个数组位置包含一个新值。这意味着v [1] = 2行在原始数组上而不是在本地复制上运行。

1 个答案:

答案 0 :(得分:5)

for k, v in d.items(): ...执行两次分配。在每次迭代中,将k分配给键,并将v分配给在d.items()上从迭代器产生的下一个(键,值)元组的值。

工作分配从不复制数据,所以

  

python3.5.4是否有某种方式可以直接给我v值,作为指向它的指针或引用,而不是在我的for循环中将值复制到局部变量v

已经在发生。

此外,在Python3.5中,dict.items的返回值是对字典中数据非常有效的视图。总之,您已经拥有了所需的一切。

相关问题