为什么python dict键/值不像鸭子那样嘎嘎叫?

use*_*629 1 python language-design

Python是鸭子类型,通常这可以避免在处理原始对象时使用faff.

典型的例子(以及名称背后的原因)是鸭子测试:如果它看起来像鸭子,像鸭子一样游泳,像鸭子一样呱呱叫,那么它可能是一只鸭子.

然而一个值得注意的例外是dict键/值,它看起来像一只鸭子,像鸭子一样游泳,但特别是不像鸭子那样嘎嘎叫.

>>> ls = ['hello']
>>> d = {'foo': 'bar'}
>>> for key in d.keys():
..      print(key)
..
'foo'
>>> ls + d.keys()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "dict_keys") to list
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么这是?

blh*_*ing 7

Dict键实际上实现了set的接口而不是列表的接口,因此您可以直接使用dict键对其他集执行set操作:

d.keys() & {'foo', 'bar'} # returns {'foo'}
Run Code Online (Sandbox Code Playgroud)

但它并没有实现__getitem__,__setitem__,__delitem__,和insert方法,这些都要求"江湖"之类的列表,所以没有被明确地转换成列表首先它不能执行任何列表操作:

ls + list(d.keys()) # returns ['hello', 'foo']
Run Code Online (Sandbox Code Playgroud)