6

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

4

2 回答 2

11

你可以得到很多项目的长度。列表、字典、集合、其他集合。因此,内部调用的内置len()type(obj).__len__(obj)函数为您提供了一个标准 API 来获取长度。

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

以下是 Python 的创造者 Guido van Rossum 的解释:

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

(a) 对于某些运算,前缀符号比后缀读起来更好——前缀(和中缀!)运算在数学中有着悠久的传统,它喜欢视觉帮助数学家思考问题的符号。将我们重写公式的简单性与使用原始 OO 表示法做同样事情的笨拙进行比较x*(a+b)x*a + x*b

(b) When I read code that says len(x) I know that it is asking for the length of something. This tells me two things: the result is an integer, and the argument is some kind of container. To the contrary, when I read x.len(), I have to already know that x is some kind of container implementing an interface or inheriting from a class that has a standard len(). Witness the confusion we occasionally have when a class that is not implementing a mapping has a get() or keys() method, or something that isn't a file has a write() method.

Saying the same thing in another way, I see 'len' as a built-in operation. I'd hate to lose that. I can't say for sure whether you meant that or not, but 'def len(self): ...' certainly sounds like you want to demote it to an ordinary method. I'm strongly -1 on that.

于 2012-11-12T13:33:59.353 回答
5

它实际上来自__len__()

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

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

object.__len__(self)

调用以实现内置函数 len()。应返回对象的长度,整数 >= 0。此外,未定义非零() 方法且其len () 方法返回零的对象在布尔上下文中被认为是假的。

于 2012-11-12T13:33:28.030 回答