d = {'x': 1, 'y': 2, 'z': 3}

for key in d:
    print(key, 'corresponds to', d[key])

Python如何认识到它只需要从字典中读取密钥?key是一个特殊的关键字,还是仅仅是一个变量?


当前回答

key只是一个变量。

对于Python2.X:

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> for my_var in d:
>>>     print my_var, 'corresponds to', d[my_var]

x corresponds to 1
y corresponds to 2
z corresponds to 3

…或更好,

d = {'x': 1, 'y': 2, 'z': 3} 

for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

对于Python3.X:

d = {'x': 1, 'y': 2, 'z': 3} 

for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

其他回答

您可以在GitHub上检查CPython的dicttype的实现。这是实现dict迭代器的方法的签名:

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
             PyObject **pvalue, Py_hash_t *phash)

CPython dictobject.c

关键不是一个特殊的词,而是字典实现了迭代器协议。你可以在你的类中这样做,例如,关于如何构建类迭代器,请参阅这个问题。

对于字典,它是在C级实现的。详细信息见PEP 234。特别是标题为“字典迭代器”的部分:

字典实现了一个tp_iter槽,该槽返回一个有效的迭代字典键的迭代器。[…]这个意味着我们可以写对于dict中的k:。。。这相当于,但比对于dict.keys()中的k:。。。只要对词典修改的限制(由循环或由另一个线程)不会被违反。向返回不同类型的迭代器显式:对于dict.iterkeys()中的键:。。。对于dict.itervalues()中的值:。。。对于键,dict.iteritems()中的值:。。。这意味着,for x in dict是x in的简写dict.iterkeys()。

在Python 3中,不再支持dict.iterkeys()、dict.itervalues()和dict.iteritems()。请改用dict.keys()、dict.values()和dict.items()。

使用for..遍历字典时。。在..中-语法,它总是在键上迭代(值可以使用dictionary[key]访问)。

要迭代键值对,请使用以下命令:

对于Python 2中dict.iteritems()中的k,v对于Python 3中dict.items()中的k,v

我有一个用例,我必须遍历dict以获得键、值对以及指示我所在位置的索引。我是这样做的:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

请注意,键、值周围的括号很重要,如果没有它们,您将得到ValueError“没有足够的值来解包”。

如果您正在寻找清晰直观的示例:

cat  = {'name': 'Snowy', 'color': 'White' ,'age': 14}
for key , value in cat.items():
   print(key, ': ', value)

结果:

name:  Snowy
color:  White
age:  14