python中的id() 函式深度解剖
最近看<python 核心程式設計2>的時候,講到可變型別和不可變型別的時候,使用id(),至於id()函式返回值,書中只是說與分配的記憶體地址有密切關係,那麼是什麼關係呢?
請看下面實驗結果:
[email protected]:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x=12
>>> id(x)
144705580
>>> hex(144705580)
'0x8a0082c'
>>>
目前變數有了是x,id的返回值也有了是'0x8a0082c' 他們之間有什麼關係呢?
除非你是地址設定的是真實模式(部分十分簡單的嵌入式系統是這樣),否則我們不能直接看地址裡面的內容.我們需要先找到這個python shell 對應的程序,然後在這個程序中看地址對應的內容.
[email protected]:~$ ps -h
2210 pts/0 Ss+ 0:00 /bin/bash
5876 pts/21 Ss 0:00 bash
5892 pts/21 S+ 0:00 python
5973 pts/22 Ss 0:00 bash
6160 pts/22 R+ 0:00 ps -h
我這個系統上程序Id是5892,進入超級使用者,gdb 除錯這個程序
#gdb attach --pid 5892
......
(gdb) print *(int *)0x8a0082c
$1 = 14
這個值是14 不是,12 ,所以可以確定的是 id的返回值如果作為地址,裡面不是直接存的id對應的內容,那麼Id對應的內容存在什麼地方了呢?
(gdb) x /16x 0x8a0082c
0x8a0082c: 0x0000000e 0x08334ba0 0x0000000c 0x00000010
0x8a0083c: 0x08334ba0 0x0000000b 0x00000011 0x08334ba0
0x8a0084c: 0x0000000a 0x0000000e 0x08334ba0 0x00000009
0x8a0085c: 0x00000025 0x08334ba0 0x00000008 0x00000011
0x0000000c的值是12 ,很可能是id對應內容的儲存位置.我可以再驗證一把,
退出GDB,否則python shell 不能操作,
>>> x=0xffee
>>> id(x)
144883596
>>>
(gdb) x /16x 144883596
0x8a2bf8c: 0x00000001 0x08334ba0 0x0000ffee 0x00000000
0x8a2bf9c: 0x08a2bfc8 0x08a7c698 0x00000000 0x08a2bfd4
0x8a2bfac: 0x00001808 0x00000001 0x08334ba0 0x0000ffff
0x8a2bfbc: 0x00000001 0x08334ba0 0x08a2bf8c 0x00000000
(gdb)
由此我們可以看到 對於python中 int 型別的變數, 其Id = (int *)&x-2 ;
複雜型別,需要進一步探究.
相關推薦
python中的id() 函式深度解剖
最近看<python 核心程式設計2>的時候,講到可變型別和不可變型別的時候,使用id(),至於id()函式返回值,書中只是說與分配的記憶體地址有密切關係,那麼是什麼關係呢? 請看下面實驗結果: [email protected]:~$ python
python中偏函式的應用
一、什麼是偏函式? (1)在Python的functools模組眾多的功能中,其中有一個就是偏函式,我們稱之為 partial function 模組的概念我們下一篇在細講。 (2)我們都聽過偏將軍吧,在三國時代的官制中,系將軍的輔佐,與裨將軍兩者都
python中eval函式作用
eval函式就是實現list、dict、tuple與str之間的轉化str函式把list,dict,tuple轉為為字串一、字串轉換成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a)print(type(
python中 mean()函式功能:求取均值
用法:mean(matrix,axis=0) 其中 matrix為一個矩陣,axis為引數 以m * n矩陣舉例: axis 不設定值,對 m*n 個數求均值,返回一個實數 axis = 0:壓縮行,對各列求均值,返回 1* n 矩陣 axis =1 :壓縮列,對各行求均
Python中split()函式用法和例項
一、描述 split()通過指定分隔符對字串進行切片,如果引數num 有指定值,則僅分隔 num 個子字串 函式形式:str.split(str="", num=string.count(str)) 引數: str -- 分隔符,預設為所有的空字元,包括空格、換行(\n)、製表
Python中檢視函式相關文件
1.dir檢視物件屬性 >>> dir(set) ['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__ge
python中encode()函式的用法
python字串函式用法大全連結 encode()函式 描述:以指定的編碼格式編碼字串,預設編碼為 'utf-8'。 語法:str.encode(encoding='utf-8', errors='strict') -> bytes (獲得by
python中count()函式的用法
python字串函式用法大全連結 count()函式 描述:統計字串裡某個字元出現的次數。可以選擇字串索引的起始位置和結束位置。 語法:str.count("char", start,end)
python中center()函式的用法
python字串函式用法大全連結 center()函式 描述:返回一個長度為width,兩邊用fillchar(單字元)填充的字串,即字串str居中,兩邊用fillchar填充。若字串的長度大於width,則直接返回字串str 語法:str.center(width , "fillcha
python中casefold()函式的用法
python字串函式用法大全連結 casefold()函式 描述:將字串中的所有大寫字母轉換為小寫字母。 語法:str.casefold() -> str 返回字串 程式示例: str1 = "I Love Python" str2 = "Groß
python中startswith()函式的用法
python字串函式用法大全連結 startswith()函式 描述:判斷字串是否以指定字元或子字串開頭。 語法:str.endswith("suffix", start, end) 或 str[start,end].endswith("suffix") 用
python中endswith()函式的用法
python字串函式用法大全連結 endswith()函式 描述:判斷字串是否以指定字元或子字串結尾。 語法:str.endswith("suffix", start, end) 或 str[start,end].endswith("suffix") 用於判
python中expandtabs()函式的用法
python字串函式用法大全連結 expandtabs()函式 描述:返回一個字串的副本。使原字串中的製表符("\t")的使用空間變大。使用空格來擴充套件空間。 語法: str.expandtabs(tabsize=8) —> str 返回字串 t
python中decode()函式函式的用法
python字串函式用法大全連結 decode()函式 描述:以 encoding 指定的編碼格式解碼字串,預設編碼為字串編碼。 encoding ——要使用的編碼,如:utf-8,gb2312,cp936,gbk等。 errors ——設定不同解碼
詳解python中format函式的強大功能
1、引數替換 format函式可以不限定引數個數,不限定引數位置。 一、不設定指定位置,按預設順序 &nb
Python雜談 | (三) Python中flatten()函式的用法
目錄 一、簡介 二、用於array 三、用於mat 四、用於列表 一、簡介 Python的flatten()函式位於numpy庫中,只適用於array或mat這兩個NumPy物件,普通的列表不行。 二、用於array 三、用於mat
Python 中 property() 函式及 @property 裝飾器的使用
Python 中 property() 函式及 @property 裝飾器的使用 文章目錄 Python 中 property() 函式及 @property 裝飾器的使用 0. 參考資料 1. property 應用場景 2.
python中join函式的用法
這個函式可以對字串按照某種方式進行拼接,比如你要在三個字母中間都新增一個特定字元,就可以用這個函式實現 result = '*'.join(['A','B','C']) print(result) #A*B*C 當然join後傳入的引數是一個string型別同樣也是可以的
python中收集函式的解包問題
收集引數的解包問題 - 把引數放入list或者字典中,直接把list/dict中的值放入收集引數中- 語法:參照案例 # 收集引數的問題 def stu(*args): print("="*20) # n表示迴圈次數 # 主要用來除錯 n = 0 for i
Python中eval函式的作用
eval函式就是實現list、dict、tuple與str之間的轉化 str函式把list,dict,tuple轉為為字串 # 字串轉換成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a) print(b)