说我有一个词典:
foo = {'a': 1}
Run Code Online (Sandbox Code Playgroud)
无论list(foo)和foo.keys()返回同样的事情.这两者有什么区别?
Aly*_*sen 12
一个区别在于Python 3. foo.keys()返回键的迭代器,这是foo.iterkeys()Python 2中的内容,同时list(foo)返回键的列表.
如下所述,foo.keys()它不会完全返回Python 3中的迭代器.它返回一个dict_keys对象(或视图),在其操作中允许迭代.您还可以做有趣的事情,例如设置操作和多次迭代.它仍然具有惰性求值的概念,这使得迭代器如此强大.
蟒蛇3:
来自官方文档
调用 foo.keys() 将返回一个字典视图对象。它支持成员测试和迭代等操作,但其内容并不独立于原始字典——它只是一个视图。
实际上,
type(foo.keys())
Run Code Online (Sandbox Code Playgroud)
给
<class 'dict_keys'>
Run Code Online (Sandbox Code Playgroud)
而在 Python 2 中
type(list(foo))
type(foo.keys())
Run Code Online (Sandbox Code Playgroud)
给
<type 'list'>
Run Code Online (Sandbox Code Playgroud)
python 2 没有真正的区别,这就是为什么我怀疑dict.keys更改为返回 python3 中的视图dict.viewkeys并被删除。
在python 3中:
In [3]: foo = dict((k,k) for k in range(4))
In [4]: foo
Out[4]: {0: 0, 1: 1, 2: 2, 3: 3}
In [5]: foo.keys?
Type: builtin_function_or_method
String form: <built-in method keys of dict object at 0x7f45d8667708>
Docstring: D.keys() -> a set-like object providing a view on D's keys
In [6]: foo.keys()
Out[6]: dict_keys([0, 1, 2, 3])
In [7]: type(foo.keys())
Out[7]: dict_keys
In [8]: for i in foo.keys():
...: del foo[i]
...:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-8-659d5446ab29> in <module>()
----> 1 for i in foo.keys():
2 del foo[i]
3
RuntimeError: dictionary changed size during iteration
In [9]: for i in list(foo):
del foo[i]
In [10]: foo
Out[10]: {}
Run Code Online (Sandbox Code Playgroud)
最后两件事基本上是你需要了解的关于python 3dict.keys和list(dictionary)python 3之间的区别的事情。dict.keys是仅仅一个按键的看法,所以检查item in dictionary.keys()是O(1),但你不能在迭代dictionary.keys()和修改字典的同时。
它们都是迭代器,因为它们都实现了__iter__.