在Python中,检查列表是否为空的最快方法是哪种?

3
在回答主要问题之前,我应该先问一下:当你尝试在Python中检查一个列表是否为空时,有没有任何情况下以下四种情况会产生不同的布尔值?
  1. if not []
  2. if not len([])
  3. if len([]) == 0
  4. if len([]) is 0
如果没有,哪种方法是检查这个布尔值最快的方法以及为什么?也就是说,在每种情况下底层到底发生了什么?差异可能微不足道,但我很好奇它们在执行过程中可能有什么不同。

1
绝对不要选择 is。两个相等的整数不能保证是同一个对象。 - user2357112
1
如果你指的是列表,请使用“list”这个词。即使它们的行为类似于其他语言称为“数组”的数据类型,也要使用正确的术语来描述Python语言,因为“array”在Python中指的是其他东西。 - user2357112
@user2357112supportsMonica,你能分享一个情况,在这种情况下两个相等的整数不会是同一个对象吗?我还是编程新手! - mysl
@mysl:https://ideone.com/EvYZVt - user2357112
1
@mysl Python解释器已经在内存中加载了-5到256之间的数字,因此如果您使用这些数字,则相等的数字可能会引用同一对象,但是如果您使用其他数字,则相等的数字可能不会引用同一对象。例如:
a = 400 b = 400 a is b False a = 200 b = 200 a is b True
- Hoxha Alban
1个回答

2

if not array

这是检查数组最惯用的方法。注意:它不适用于其他可迭代对象,例如numpy数组。

if not len(array)

与上面的表达式等价,但不够惯用。它可以用于numpy数组,但在具有自定义__len__的其他可迭代对象上可能仍然失败(不存在威胁,要明确)。

if len(array) == 0

与上面相同,但消除了自定义可迭代对象的不存在威胁。

if len(array) is 0

危险区域:由于实现细节,它在CPython中可以工作,但通常不能保证它不会在将来出现故障,或者它能在其他Python实现上工作。 非常应该避免使用。


我在哪里可以找到关于未来不会出现故障(或者能够正常工作)的保证? - lalala
@lalala 只有在主要版本中,即 Python 4 中才能引入不兼容的后向变更。规范之外的事物可以随时更改。因此,CPython 的当前实现对于从 -5 到略高于 100 的整数具有特殊行为,但这不是规范的一部分,只是加速技巧。诸如此类的事情取决于实现,并且可能会发生变化。 - Marat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接