python:list(dict)和dict.keys()之间的区别?

lan*_*ng2 5 python

说我有一个词典:

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对象(或视图),在其操作中允许迭代.您还可以做有趣的事情,例如设置操作和多次迭代.它仍然具有惰性求值的概念,这使得迭代器如此强大.

  • 是的,请同时检查文档-https://docs.python.org/3/tutorial/datastructures.html-脚注的最后一点。dict.keys()返回一个字典视图对象(不是迭代器)。 (2认同)

Pyn*_*hia 9

蟒蛇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)


Nig*_*een 7

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.keyslist(dictionary)python 3之间的区别的事情。dict.keys仅仅一个按键的看法,所以检查item in dictionary.keys()是O(1),但你不能在迭代dictionary.keys()和修改字典的同时。

它们都是迭代器,因为它们都实现了__iter__.