为什么len(list)而不是python中的list.len()?

时间:2012-11-12 13:32:27

标签: python list

可能是一个奇怪的问题。但是我一直在摸不着为什么如果你想得到一个列表的长度,你不能简单地说list.len(),你必须将列表传递给len()来获得它的大小?这个len()实际来自哪里?

2 个答案:

答案 0 :(得分:10)

你可以得到很多物品的长度。列表,词组,集合,其他集合。因此,在内部调用type(obj).__len__(obj)的{​​{3}}会为您提供标准API来获取长度。

如果所有这些集合类型都有一个直接调用的len()方法,则无法阻止某人创建使用例如自定义集合类的自定义集合类。 .length().length属性。

builtin len()来自Python的创造者Guido van Rossum的解释:

  

首先,由于HCI的原因,我选择len(x)而不是x.len()def __len__()来得更晚)。实际上有两个相互交织的原因,都是HCI:

     

(a)对于某些操作,前缀表示法只读取比   postfix - prefix(和infix!)操作有着悠久的传统   数学,喜欢视觉效果帮助的符号   数学家思考问题。比较我们的简单方法   将x*(a+b)之类的公式重写为x*a + x*b以使其笨拙   使用原始OO表示法做同样的事情。

     

(b)当我阅读代码len(x)知道它要求的时候   某事的长度。这告诉我两件事:结果是   整数,参数是某种容器。与此相反的,   当我阅读x.len()时,我必须知道x是某种   容器实现接口或从类继承   有一个标准的len()。见证我们偶尔会遇到的困惑   未实现映射的类具有get()keys()   方法或非文件的方法具有write()方法。

     

以另一种方式说同样的事情,我认为'len'是内置的   操作。我不想失去那个。我不能肯定地说你是否意味着,但是'def len(self):......'肯定听起来像你   想把它降级为普通的方法。我非常喜欢这个。

答案 1 :(得分:5)

它实际上来自__len__()

In [15]: lis=[1,2,3]

In [16]: lis.__len__()
Out[16]: 3

object.__len__(self):

  

调用实现内置函数len()。   应该返回对象的长度,一个整数> = 0.另外,一个   没有定义非零()方法且 len ()的对象   方法返回零在布尔上下文中被视为false。