在Python2.x中使用“is”运算符将对象与空元组进行比较

2024-09-26 22:55:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我习惯于在Python中看到if obj is None:,最近我遇到了{}。由于元组是不可变的,所以在Python解释器中,让空元组成为一个单元组听起来是合理的内部优化,因此允许使用is,而不需要{}。但这有保证吗?从哪个版本的口译员开始?在

[编辑]这个问题很重要,因为如果()不是单例的,并且有一种方法可以生成一个具有不同地址的空元组,那么使用is {}就是一个错误。如果它只在python2.x和x>;0之后得到保证,那么在需要确保代码的向后兼容性时,了解x的值是很重要的。在使用pypy/jython/ironpython时,要知道这是否会破坏代码。。。在


Tags: 方法代码版本noneobj编辑ifis
3条回答

这是CPython当前版本的不保证实现细节,因此您不一定能够在其他Python实现中依赖它,包括Jython、IronPython、pypyy以及CPython的未来版本。在

与大列表相比,在我的系统上使用is似乎快了0.04μs:

$ python -m timeit -s "x = range(10000)" "x is ()"
10000000 loops, best of 3: 0.0401 usec per loop

$ python -m timeit -s "x = range(10000)" "x == ()"
10000000 loops, best of 3: 0.0844 usec per loop

当然,如果您使用自定义的__eq__()方法与之进行比较,情况可能会更糟:

^{pr2}$

不过,如果这种效率差异是至关重要的,我认为这将指向一个设计问题。在

来自Python 2docs和Python 3docs

... two occurrences of the empty tuple may or may not yield the same object.

换句话说,您不能指望() is ()来计算为true。在

让我们使用id()方法来获取()的内部id:

>>> id(())
140180995895376
>>> empty_tuple = ()
>>> id(empty_tuple)
140180995895376        # same as the id of ()
>>> from copy import copy
>>> id(copy(empty_tuple))
140180995895376        # still the same as the id of ()

在python中()似乎被有效地存储为一个单例(至少在python>;2.6中是这样)。在

""空字符串变量也有相同的行为。在

相关问题 更多 >

    热门问题