首先,我們應該從Python開始,它的工作方式與C不同。在C中,數組只是一塊內存。在Python中,它是一個對象。 c
和c[0]
的id()
與結果不一樣。
其次,你應該認識到Python中的每一件事都是一個對象。在C中,當你想做類似c[0]
的事情時,你正在請求一系列內存位置的第一個值。在Python中,情況並非一定如此。對於一個標準列表,它由一個數組支持,但是它的地址對你來說是隱藏的。你看到的是通過id()
對象的地址。在這種情況下,c
是一個字符串,但這樣是c[0]
(沒有字符類型在Python)。這意味着當您要求c[0]
時,Python正在創建一個新字符串來表示您請求的字符(或者說,子字符串)。幸運的是,Python實際上並沒有每次創建一個新的字符串,因爲Python會自動實現一個字符的字符串。
另外,記住,Python對象有一個結構和太消耗內存。關於C的最好的事情之一是能夠非常控制內存佈局,但是你在Python中失去了這方面的能力。翻蓋面是,你不必做手工分配和內存,這是一種解脫(我做了很多C和Python編程,讓我看到了好處)釋放。
三,很多更多的內存分配和釋放在Python中發生。根據構建Python的方式以及分配內存的底層操作系統策略,可能會發生任何數量的事情,導致地址不會按順序增加。但由於一切是一個對象,有一個潛在的分配正在發生的一切。
我有這個疑問,因爲我學過C++第一(說實話,用Turbo C++)和字符串的地址都是用Python定義方式是用C會發生什麼++非常不同。我想這在Python中是好的,因爲我們不能通過它在Python中的地址來訪問對象,對嗎?
yes和no。當你說c[0]
時,在引擎蓋下面正在運行一個特殊的方法來從字符串中檢索子字符串。這與你在C++中獲得的不同。但是,Python確實將字符串作爲字節序列進行有效存儲。所以只是因爲你看不到效率檢查地址,並不意味着它不在那裏。另外,正如我上面提到的,c[0]
返回一個新的字符串,表示您想要的子字符串。 Python在這裏很聰明,會返回一個1個字符的字符串,但它將是一個內部字符串。你可以看到一些字母具有相同的地址:
>>> for c in "hobo":
... print c, id(c)
...
h 4434994600
o 4434861432
b 4434859712
o 4434861432
你可以看到,"o"
共享相同的地址字符串 - 順便說一句,這個例子的Python 2,但在Python 3
存在同樣的質量
而且你是正確的,你不能訪問由它的地址對象 - 至少這是不是語言的一個特徵。如何生成ids是一個實現細節,但是你應該指望每個Python解釋器都這樣做。
另外,爲c和c [0]設置不同的地址有什麼意義?對於某些人來說,這些問題可能是不必要的,但我很好奇,不知道Python如何爲各種數據類型(特別是字符串)分配地址。
我解釋這上面,而是概括:c
和c[0]
比在C.在Python不同,首先是字符串和第二請求包含字符串的第一個字符的子字符串。
Python做在許多領域使用的舞臺風格的內存管理方案,但在大多數情況下,你不需要關心這個。如果你好奇,我建議你看看Python source code。 Python
子目錄具有許多語言和低級運行時支持位。同時也意識到,Python也預先緩存了一些內容,這也可以解釋上述地址中的差異。
另外解釋downvote,因爲這是我在這個網站上的第一個問題。 –