为什么这些元组从函数返回相同?

Vad*_*aev 7 python python-3.6

假设我有一个功能:

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语言无法保证.这可能就是为什么你在文档中找不到它:)


Yuv*_*rie 6

Python优化了返回值.
因为解释器很容易看到返回的元组每次都是相同的,并且它是一个不可变对象,它返回相同的对象(完全相同的一个.相同的内存地址).
在这里,当你这样做时,a is b你实际上会问id(a) == id(b).

  • 重要的是要注意Python的特定*实现*可以执行这样的优化.语言本身没有这样的保证. (7认同)