2017-08-02 59 views
1

alist += [4]alist = alist + [4]是不同的,因爲第一個修改了alist的引用,而後者沒有。我通過使用id()在IDLE上嘗試了這一點,它似乎是正確的說法。在Python中獲取內存地址,確定它是列表還是字典並更新其內容

上執行IDLE(Python的3.6.1)代碼

>>> alist = [1, 2, 3] 
>>> id(alist) 
50683952 
>>> alist += [4] 
>>> id(alist) 
50683952 
>>> alist = alist + [4] 
>>> id(alist) 
50533080 

這裏是id()文檔:https://docs.python.org/3/library/functions.html#id

是否有可能得到引用的內存地址編程,確定該位置是否有一個列表或字典,閱讀內容並使用參考更新內容?

NOTE:我發現2相關的stackoverflow帖子,但我不知道他們是否回答我的問題。

+1

什麼'ID'返回不是內存位置。你不能用python訪問這些文件。事實上,你不能以任何語言訪問它(甚至C,你得到的只是邏輯地址)。 –

+0

啊好的,但文檔說ID()是內存中的對象的地址。 – JRG

+1

肯定是用詞不當。它只是一個給出對象引用的_indication_的整數,它隱約類似於內存引用。 –

回答

1

您正在嘗試做這樣的事情在C,具有引用操作,如*,你可以在this question閱讀更多關於它。 我相信Python不會支持你正在努力實現的目標,你必須改變自己的思維範式,思考不同以得到你想要的結果。

當你讀,你可以「獲取內存地址」從對象,但你要永遠找到一種方法(至少在Python 2 - 3)回來的路上

0

如果您需要檢查一個Python對象是否是字典或列表,請使用isinstance。如果您需要檢查對象的唯一標識符(與內存地址有關,我相信),請使用id。如果您需要按值檢查相等性,請使用==

沒有理由去做你現在正在做的事情:Python中的所有東西都是一個引用計數的垃圾收集指針,你不應該擔心這是如何實現的。除了易於破解版本之外,它還有意不在Python API中導出。

如果你在C API中需要PyObject的地址,那它已經是一個指針了(並且已經爲你完成了)。您可以使用C API來檢查已知爲PyObject的指針是否爲dictlist

相關問題