2015-07-13 63 views
1

所以我在Python 2.7遇到了一個有趣的現象,我的好奇,想知道爲什麼會發生。我定義了以下4層的數據結構在python 2.7:Python對象分配地址

  • 設置爲 'ST'
  • 列表 'LST'
  • 元組'TPL '
  • A dictionary as'DCT

使用Python創建它們:

st = set(['apple', 'orange', 'apple', 'pear', 'orange', 'banana']) 
lst = [1, 2, 3, "4"] 
tpl = (1, 2, 3, '4') 
dct = {'one': 1, 'two': 2, 'three': 3}; 

這裏是4個對象的表示:

st.__repr__ 
<method-wrapper '__repr__' of set object at 0x7f234997ba48> 

tpl.__repr__ 
<method-wrapper '__repr__' of tuple object at 0x7f23499667e0> 

lst.__repr__ 
<method-wrapper '__repr__' of list object at 0x7f2349910b48> 

dct.__repr__ 
<method-wrapper '__repr__' of dict object at 0x25af3a0> 

正如你所看到的,我的字典裏被放置在一個完全不同的存儲器部分(0x25af3a0)與其他(0x7f23499 *****)相比較。

我的問題是,爲什麼字典對象被置於一個完全不同的內存段?

Python版本是2.7.3(在linux上用GCC 4.7.2編譯),linux版本是3.18.0-kali3-amd64#1 SMP Debian 3.18.6-1〜kali2(2015-03-02) x86_64 GNU/Linux)。

+0

是一個問題? 有什麼,你需要做的地址?只是一個查詢! – Ja8zyjits

+0

沒問題,我只想知道它爲什麼會發生。是的,我[再次嘗試](http://pastebin.com/2zvR3W3D),字典又放到了不同的地方。 –

+0

地址空間佈局隨機化在行動? – tynn

回答

1

Python使用很多的微小和臨時對象(特別是dict s,用於傳遞參數,存儲屬性等)。爲了減少每次創建或銷燬對象時分配和釋放內存的開銷,CPython通過爲各種大小的小對象預先分配內存插槽陣列來進行優化。

所以,當你創建一個小對象時,Python不會像你期望的那樣分配內存。而是使用自己的啓發式來選擇其已經放置的一個存儲位置。新的內存僅在Python的預分配小塊的「競技場」的相關部分已滿時才分配。