比方說,我有一個函數:爲什麼從一個函數返回的這些元組是相同的?
def get_tuple():
return (1,)
在IDLE如果我叫:
get_tuple() is get_tuple()
它將打印True
如果我稱之爲:
(1,) is (1,)
它將打印False
你知道爲什麼嗎? 我在Python文檔中找不到解釋。
比方說,我有一個函數:爲什麼從一個函數返回的這些元組是相同的?
def get_tuple():
return (1,)
在IDLE如果我叫:
get_tuple() is get_tuple()
它將打印True
如果我稱之爲:
(1,) is (1,)
它將打印False
你知道爲什麼嗎? 我在Python文檔中找不到解釋。
Python的CPython實現存儲函數中用作優化的常量值(例如數字,字符串,元組或frozensets)。您可以通過func.__code__.co_consts
觀察他們:
>>> def get_tuple():
... return (1,)
...
>>> get_tuple.__code__.co_consts
(None, 1, (1,))
正如你可以看到,這個功能的常量None
(這是默認的返回值),1
和(1,)
得到保存。由於該函數返回其中的一個,因此每次調用都會得到完全相同的對象。
因爲這是一個CPython實現細節,所以不能由Python語言保證。這可能是爲什麼你不能在文檔中找到它:)
也許是因爲內存中的地址。只是嘗試通過 print memory address of Python variable
Python優化返回值。
因爲解釋器很容易看到返回的元組每次都是相同的,並且它是不可變的對象,它將返回相同的對象(完全相同的內存地址)。
在這裏,當你做a is b
你其實問id(a) == id(b)
。
你知道如何在Python文檔中找到它嗎? –
重要的是要注意Python的特定*實現*可以執行這樣的優化。這種語言本身並沒有這樣的保證。 – chepner
@Kristofee是每個調用它返回相同的,但我不明白爲什麼,因爲我期望每個函數調用將返回新的對象。 –