【问题标题】:How does Python manage to loop through values in a dictionary?Python 如何设法遍历字典中的值?
【发布时间】:2019-09-30 16:05:01
【问题描述】:

我想知道 Python 如何循环遍历字典中的值。我知道如何在代码中做到这一点,我读过的所有答案都只是解释了如何做到这一点。 我想了解 python 如何找到值,因为我认为字典值与键相关联。字典项也有索引值吗? 感谢您提前提供相关来源的答案或参考:)

我已经用 Google 搜索、stackoverflow 和阅读了。

编辑:我对 Python3.7 如何实现这一点很感兴趣

【问题讨论】:

  • 在内部,我想字典项目保存在一个链表中。所以迭代值只是归结为遍历一个链表。但这是一个非常底层的细节,对程序员完全隐藏,并且在各种 Python 实现中可能存在很大差异。
  • 这篇优秀的youtube video 由核心 Python 开发人员 Raymond Hettinger 解释了字典是如何在不同版本的 Python 中实现的。

标签: python loops dictionary python-3.7 dictionary-comprehension


【解决方案1】:

根据源代码 (dict_items(PyDictObject *mp)) 分配了 n 个(字典中键/值对的大小 # 个)元组的列表,并且对于每个非空值项(第 2278 行:if (value != NULL)),它设置在元组列表的相应索引处。 python 对象本身基本上是一块内存,它知道每个对象的大小 (offset)、值的开始位置 (value_ptr) 以及键的位置 (ep)。因此,当您获取键/值 (for k,v in object) 时,它基本上会遍历对象已分配内存的已用完部分。

顺便说一句,知道 PyList_SET_ITEM 只是一个通过所需索引设置数组中的值的宏可能会有所帮助:#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item\[i\] = (v))。由于数组只是顺序存储在内存中的值,因此索引运算符知道将值放在内存位置start + (sizeOf(object)*index)

免责声明:这是我第一次尝试阅读 python 源代码,所以我的解释可能有点偏离或过于简单。

【讨论】:

  • 尽管有这个名字,dict_items 实际上并没有被 dict.items() 或任何 dict 方法使用。在迭代器/视图代码中,字典迭代较低。
  • 另外,与 John Gordon 所说的不同,链表在过程中的任何时候都不涉及。
  • 更重要的是给出了 Python 如何遍历键/值的示例。我在整个核心函数中看到了很多指针操作,这似乎是更易读/更容易理解的方法之一。我不认为“对象中的键,值”(这可能是迭代对象/字典的最常见方式)将以完全不同的方式执行/实现 - 但如果我错了,请纠正我。
  • 在字典的实际迭代中不会发生任何列表内容。
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2023-03-29
相关资源
最近更新 更多