我相信儘管像str這樣的Python原語是通過函數內的值存儲在內存中的,但爲了簡化內存管理,函數中會有不同的分配。
Python的對象分配不起作用。沒有一個真正的「原語」概念,除了字節碼編譯器爲合併常量所做的一些事情之外,兩個對象是在同一個函數中創建還是在不同的函數中創建並不重要。
是不是真的有一個更好的答案,這不是指向源,所以here it is:
Py_LOCAL_INLINE(PyObject *)
STRINGLIB(split_whitespace)(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
Py_ssize_t maxcount)
{
...
#ifndef STRINGLIB_MUTABLE
if (j == 0 && i == str_len && STRINGLIB_CHECK_EXACT(str_obj)) {
/* No whitespace in str_obj, so just use it as list[0] */
Py_INCREF(str_obj);
PyList_SET_ITEM(list, 0, (PyObject *)str_obj);
count++;
break;
}
如果它沒有找到任何空白分裂,它只是重新使用原來的字符串對象在返回的列表中。這只是這個函數寫法的一個怪癖,你不能依賴它在其他Python版本或非標準Python實現中以這種方式工作。
否,原因是「是」是指相同的存儲器位置它與'=='不一樣,將你的比較改爲==,它們會正常工作,'是'應該只用於比較靜態內存中的元素,比如None。True/False – gkusner