例如:對原始類型變量執行「=」時,CPython實際上會做什麼?
a = some_process_that_generates_integer_result()
b = a
有人告訴我,b和一個將指向整數對象的同一塊,從而b將修改該對象的引用計數。該代碼在功能PyObject* ast2obj_expr(void* _o)
在Python的ast.c執行:
static PyObject* ast2obj_object(void *o)
{
if (!o)
o = Py_None;
Py_INCREF((PyObject*)o);
return (PyObject*)o;
}
......
case Num_kind:
result = PyType_GenericNew(Num_type, NULL, NULL);
if (!result) goto failed;
value = ast2obj_object(o->v.Num.n);
if (!value) goto failed;
if (PyObject_SetAttrString(result, "n", value) == -1)
goto failed;
Py_DECREF(value);
break;
不過,我認爲修改引用計數沒有所有權變更確實是徒勞的。我期望的是每個包含原始值(浮點數,整數等)的變量總是有自己的值,而不是指向同一個對象。
而且在我簡單的測試代碼的執行,我發現上面的Num_kind
分支破發點從未達到:
def some_function(x, y):
return (x+y)*(x-y)
a = some_function(666666,66666)
print a
b = a
print a
print b
b = a + 999999
print a
print b
b = a
print a
print b
我使用的是由Debian提供的python2.7-DBG程序。我確定程序和源代碼是相匹配的,因爲許多其他斷點正常工作。
那麼,CPython實際上對原始類型對象做了什麼?
我不確定你在這裏問什麼。你指的是什麼斷點?您希望通過該代碼得到什麼樣的行爲?它是如何不符合您的期望的? – poke
@poke添加缺少的描述。斷點位於上面C代碼的Num_kind分支中,正如有人告訴我那段代碼與運行時數字變量複製相關。 – jiandingzhe
「每個變量保持原始值」。 Python實際上並不擁有持有值的變量。相反,它具有可以綁定到名稱的強類型對象。這與C風格的數據模型完全不同,嘗試以C術語理解Python數據模型很少有成果,除非您碰巧與C代碼交互。您可能會發現這篇文章有用:[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html),這是由SO老將Ned Batchelder編寫的。 –