为什么从一个函数返回的这些元组是相同的?
Why are these tuples returned from a function identical?
假设我有一个函数:
def get_tuple():
return (1,)
在空闲状态下,如果我调用:
get_tuple() is get_tuple()
它将打印True
如果我打电话:
(1,) is (1,)
它将打印False
你知道为什么吗?
我在 Python 文档中找不到解释。
可能是因为内存中的地址。只需尝试通过打印它们
print memory address of Python variable
Python 优化 return 值。
因为解释器很容易看出returned元组每次都是一样的,而且是不可变的对象,所以return是同一个对象(完全一样的。同一个内存地址)。
在这里,当你做 a is b
你实际上问 id(a) == id(b)
.
Python 的 CPython 实现存储函数中用作优化的常量值(例如数字、字符串、元组或冻结集)。您可以通过 func.__code__.co_consts
:
观察它们
>>> def get_tuple():
... return (1,)
...
>>> get_tuple.__code__.co_consts
(None, 1, (1,))
如您所见,对于此函数,存储常量 None
(默认 return 值)、1
和 (1,)
。由于函数 return 是其中之一,因此每次调用都会得到完全相同的对象。
因为这是一个 CPython 实现细节,Python 语言不保证它。这可能就是您在文档中找不到它的原因:)
假设我有一个函数:
def get_tuple():
return (1,)
在空闲状态下,如果我调用:
get_tuple() is get_tuple()
它将打印True
如果我打电话:
(1,) is (1,)
它将打印False
你知道为什么吗? 我在 Python 文档中找不到解释。
可能是因为内存中的地址。只需尝试通过打印它们 print memory address of Python variable
Python 优化 return 值。
因为解释器很容易看出returned元组每次都是一样的,而且是不可变的对象,所以return是同一个对象(完全一样的。同一个内存地址)。
在这里,当你做 a is b
你实际上问 id(a) == id(b)
.
Python 的 CPython 实现存储函数中用作优化的常量值(例如数字、字符串、元组或冻结集)。您可以通过 func.__code__.co_consts
:
>>> def get_tuple():
... return (1,)
...
>>> get_tuple.__code__.co_consts
(None, 1, (1,))
如您所见,对于此函数,存储常量 None
(默认 return 值)、1
和 (1,)
。由于函数 return 是其中之一,因此每次调用都会得到完全相同的对象。
因为这是一个 CPython 实现细节,Python 语言不保证它。这可能就是您在文档中找不到它的原因:)