繁体   English   中英

我收到RuntimeError:字典在迭代过程中更改了大小。 蟒蛇

[英]I'm getting RuntimeError: dictionary changed size during iteration. Python

这是我的示例代码:

def clean(record):

    record.pop('configurable_fields')
    record.pop('applied_discounts')
    record.pop('product_options')

    for key, value in record.items():
        if value is None:
            record.pop(key)

    return record

我收到此错误:

Traceback (most recent call last):
  File "C:\Users\Filipe\Dropbox\code\bigAnalysis\finalized scripts\importer.py", line 76, in <module>
    process_file('allOrderProductsData')
  File "C:\Users\Filipe\Dropbox\code\bigAnalysis\finalized scripts\importer.py", line 73, in process_file
    process_line(line)
  File "C:\Users\Filipe\Dropbox\code\bigAnalysis\finalized scripts\importer.py", line 58, in process_line
    product_id = dump_record('package', clean(package))  # id of recently created record
  File "C:\Users\Filipe\Dropbox\code\bigAnalysis\finalized scripts\importer.py", line 40, in clean
    for key, value in record.items():
RuntimeError: dictionary changed size during iteration

我尝试了在其他线程中找到的一些解决方案,例如使用copy.deecopy,但是到目前为止,它们都没有起作用。

采用

for key, value in list(record.items()):

代替

for key, value in record.items():

这样,您可以“冻结”要迭代的项目列表。 record.items()是仍然保留对原始字典的引用的生成器。 list(record.items())是一个独立的列表。

为了避免在迭代过程中更改字典大小,可以改为返回一个新的字典:

def clean(record):

    record.pop('configurable_fields')
    record.pop('applied_discounts')
    record.pop('product_options')

    return {k: v for k, v in record.items() if v is not None}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM