gpt4 book ai didi

python - 字典在迭代过程中改变了大小 - 代码在 Py2 中工作,在 Py3 中不工作

转载 作者:行者123 更新时间:2023-12-02 04:56:00 26 4
gpt4 key购买 nike

我有以下示例代码:

k_list = ['test', 'test1', 'test3']

def test(*args, **kwargs):
for k, value in kwargs.items():
if k in k_list:
print("Popping k = ", k)
kwargs.pop(k, None)
print("Remaining KWARGS:", kwargs.items())

test(test='test', test1='test1', test2='test2', test3='test3')

在 Python 2.7.13 中,这会打印出我所期望的内容,并且在 kwargs 中仍然留有一个项目:

('Popping k = ', 'test')
('Popping k = ', 'test1')
('Popping k = ', 'test3')
('Remaining KWARGS:', [('test2', 'test2')])

但是,在 Python 3.6.1 中,这会失败:

Popping k =  test
Traceback (most recent call last):
File "test1.py", line 11, in <module>
test(test='test', test1='test1', test2='test2', test3='test3')
File "test1.py", line 5, in test
for k, value in kwargs.items():
RuntimeError: dictionary changed size during iteration

我需要调整什么才能保持 Python 2 兼容性,但又能在 Python 3.6 中正常工作?剩余的 kwargs 将用于我的脚本中的后续逻辑。

最佳答案

它在 python2.x 中工作的原因是因为 kwargs.items() 创建了一个列表——您可以将其视为字典键值对的快照。由于它是快照,因此您可以更改字典,而无需修改正在迭代的快照,一切正常。

在 python3.x 中,kwargs.items() 在字典的键值对中创建一个 View 。由于它是一个 View ,因此您不能再在不更改 View 的情况下更改字典。这就是为什么你在 python3.x 中遇到错误

适用于 python2.x 和 python3.x 的一个解决方案是始终使用 list 内置函数创建快照:

for k, value in list(kwargs.items()):
...

或者,通过复制字典来创建快照:

for k, value in kwargs.copy().items():
...

这会起作用。在我在交互式解释器中进行的一个非常不科学的实验中,第一个版本在 python2.x 上比第二个版本快很多。另请注意,这整个事情在 python2.x 上效率会稍低,因为您将创建某些内容的附加副本(listdict,具体取决于您使用的版本)引用)。根据您的其他代码,这看起来并不太令人担忧。如果是,您可以使用类似 six 的内容兼容性:

for k, value in list(six.iteritems(kwargs)):
...

关于python - 字典在迭代过程中改变了大小 - 代码在 Py2 中工作,在 Py3 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45830124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com