假设我有一个功能:
def get_tuple():
return (1,)
Run Code Online (Sandbox Code Playgroud)
如果我打电话给IDLE:
get_tuple() is get_tuple()
Run Code Online (Sandbox Code Playgroud)
它会打印出来 True
如果我打电话:
(1,) is (1,)
Run Code Online (Sandbox Code Playgroud)
它会打印出来 False
你知道为什么吗?我在Python文档中找不到解释.
Eug*_*ash 17
Python的CPython实现存储函数中使用的常量值(例如数字,字符串,元组或frozensets)作为优化.你可以通过func.__code__.co_consts以下方式观察它
>>> def get_tuple():
... return (1,)
...
>>> get_tuple.__code__.co_consts
(None, 1, (1,))
Run Code Online (Sandbox Code Playgroud)
如您所见,对于此函数,常量None(这是默认的返回值),1并(1,)得到存储.由于函数返回其中一个函数,因此每次调用都会得到完全相同的对象.
因为这是一个CPython实现细节,所以Python语言无法保证.这可能就是为什么你在文档中找不到它:)
Python优化了返回值.
因为解释器很容易看到返回的元组每次都是相同的,并且它是一个不可变对象,它返回相同的对象(完全相同的一个.相同的内存地址).
在这里,当你这样做时,a is b你实际上会问id(a) == id(b).