gpt4 book ai didi

python - Python 怎么知道有人在遍历 dict?

转载 作者:行者123 更新时间:2023-12-04 16:36:44 24 4
gpt4 key购买 nike

如果有人尝试:

my_dict = {1: 1}
for key in my_dict:
my_dict.pop(key)

一个人会得到:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

Python 会抛出一个错误,因为你在遍历它时改变了字典的大小。

Python 如何知道发生了这种情况,能否以编程方式覆盖此功能以便代码运行?

在有人问出“我为什么要这样做”这个不可避免的问题之前:我不想。我在问一个问题。这叫做好奇心。

例如:

假设我有一个包含 5 个项目的字典。上面的代码应该简单地删除字典中的所有项目!

最佳答案

如果您在 Python 源代码中搜索“dictionary changed size during iteration”,您将找到 Objects/dictobject.c:

static PyObject*
dictiter_iternextkey(dictiterobject *di)
{
/* ... omitted ... */

if (di->di_used != d->ma_used) {
PyErr_SetString(PyExc_RuntimeError,
"dictionary changed size during iteration");
di->di_used = -1; /* Make this state sticky */
return NULL;
}

ma_used 字段只是字典中项目的数量,如 dictobject.h 中所述:

/* Number of items in the dictionary */
Py_ssize_t ma_used;

di_used 只是创建迭代器时该值的副本。

你不能以编程方式改变它,至少不能以任何合理的方式改变它(我们不要猴子补丁 dict)。如果愿意,您可以创建自己的字典类型,并定义行为不同的迭代器。

Python 这样做的原因是,当您遍历正在变化的哈希表时,很难弄清楚该做什么是“正确的”。

编写自己的哈希表实现是一个很好的练习,您会很快发现问题……当您在哈希表中插入或删除条目时,它可能会改变其他条目的顺序——是否可以接受迭代器跳过条目,还是返回相同的条目两次?可能不是。你能创建一个数据结构来提供你想要的迭代行为吗?是的,但是很复杂,这样做的哈希表在其他场景下可能表现更差。

关于python - Python 怎么知道有人在遍历 dict?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68958983/

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