2024-09-26 22:55:26 发布
网友
我习惯于在Python中看到if obj is None:,最近我遇到了{}。由于元组是不可变的,所以在Python解释器中,让空元组成为一个单元组听起来是合理的内部优化,因此允许使用is,而不需要{}。但这有保证吗?从哪个版本的口译员开始?在
if obj is None:
is
[编辑]这个问题很重要,因为如果()不是单例的,并且有一种方法可以生成一个具有不同地址的空元组,那么使用is {}就是一个错误。如果它只在python2.x和x>;0之后得到保证,那么在需要确保代码的向后兼容性时,了解x的值是很重要的。在使用pypy/jython/ironpython时,要知道这是否会破坏代码。。。在
is {}
这是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__()方法与之进行比较,情况可能会更糟:
__eq__()
不过,如果这种效率差异是至关重要的,我认为这将指向一个设计问题。在
来自Python 2docs和Python 3docs:
... two occurrences of the empty tuple may or may not yield the same object.
换句话说,您不能指望() is ()来计算为true。在
() is ()
让我们使用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中是这样)。在
""空字符串变量也有相同的行为。在
""
这是CPython当前版本的不保证实现细节,因此您不一定能够在其他Python实现中依赖它,包括Jython、IronPython、pypyy以及CPython的未来版本。在
与大列表相比,在我的系统上使用
is
似乎快了0.04μs:当然,如果您使用自定义的
^{pr2}$__eq__()
方法与之进行比较,情况可能会更糟:不过,如果这种效率差异是至关重要的,我认为这将指向一个设计问题。在
来自Python 2docs和Python 3docs:
换句话说,您不能指望
() is ()
来计算为true。在让我们使用id()方法来获取()的内部id:
在python中()似乎被有效地存储为一个单例(至少在python>;2.6中是这样)。在
""
空字符串变量也有相同的行为。在相关问题 更多 >
编程相关推荐