1、如何理解一切皆物件的python變數類似c語言的指標引用?
id()函式返回物件的唯一識別符號,識別符號是乙個整數。
cpython 中id()函式用於獲取物件的記憶體位址。
在python中,一切都是物件,所有變數都是對某個物件的引用(有點像指標),記憶體管理自動進行(類似c++智慧型指標)。
為了高效利用記憶體,a和b都是對乙個記憶體中物件的引用,賦值(=)實際上是建立乙個物件,將位址給引用變數。** a is b 相當於 a和b不僅內容相同,位址也相同。這可能也是判斷物件是否為none的時候必須寫 if x is none 的原因。
#相同小整數的id相同
>>> a,b=1,1
>>> a==b #true
>>> a is b #true
>>> id(a) #140732401194656
>>> id(b) #140732401194656
#相同大整數的id不相同
>>> a=2333
>>> b=2333
>>> a==b #true
>>> a is b #false
>>> id(a) #53164792l
>>> id(b) #53164816l
#相同浮點數的id不同
>>> a=3.1415926
>>> b=3.1415926
>>> a==b #true
>>> a is b #false
>>> id(a) #2460330531312
>>> id(b) #2460330531280
在c語言函式的區域性變數的位址處於呼叫棧內,在函式執行完成後,呼叫棧就會被彈出,區域性變數的位址就失效了,不能在引用了。idtest函式執行完畢後,將a的記憶體位址返回給了b。python確實沒有為b重新建立乙個新的物件,a物件對應的位址被傳給了b,但是a這個變數也隨著idtest函式執行完畢而消失了。python中的變數,像指標,但卻不是指標,只是物件的引用。a的有效範圍在idtest函式內,idtest函式執行完後,a就不復存在,b獲取了idtest函式的「返回值」。猜測python自己管理記憶體的可能是(a本身被彈出棧,a指向的記憶體物件還在別的地方存在著,只要其引用計數不為0)。
#返回函式區域性變數
def idtest():
a = 12345
print(id(a))
return a
b = idtest() #2460327577968
print(id(b)) #2460327577968
特別的,python兩個函式定義不相同的列表,id可能會相同。
1:都加上return 將列表值返回出來
2:且再用變數引用時才會出現id不同
3:或者,在列表名字繫結前,有別的賦值語句。
1和2兩個條件缺任何乙個都會使得id相同。無論不同函式內部定義的列表是否相同,是否空或者很長。
#不同函式中的列表id相同
>>> def f1():
... a=[1,2,3]
... print(a,id(a))
...>>> def f2():
... b=[1,2]
... print( b,id(b))
... return b
...>>> f1() #[1, 2, 3] 2460330764288
>>> f2() #[1, 2] 2460330764288
另外python可以呼叫系統dll時使用指標。
#python呼叫c語言之使用指標
from ctypes import windll, structure, c_long, byref
class cpoint(structure):
_fields_ = [("x", c_long), ("y", c_long)]
def whereismouse():
pt = cpoint()
windll.user32.getcursorpos(byref(pt))
print(r'獲取滑鼠位置',pt.x,pt.y)
#獲取滑鼠位置 1416 745
其他
參考
小知識積累
1.有關 和printf的應用 printf是從右向左壓棧 printf d,d n ptr,ptr 先是 ptr 從右至左,所以輸出的兩個值是一樣的 ptr 123 那麼先是 ptr 123 然後是ptr 2.float a 1.0f int a的作用是將浮點數字址開始的sizeof int 個位...
python小知識點積累
shutil.rmtree 表示遞迴刪除資料夾下的所有子資料夾和子檔案 from unittest import mock python3.4後內建mock庫python單例模式 裝飾器 decorator 可以動態地修改乙個類或函式的功能。也可以使用裝飾器來裝飾某個類,使其只能生成乙個例項 fro...
jsp小知識積累
清除頁面快取 response.setheader pragma no cache response.setheader cache control no cache response.setdateheader expires 0 getoutputstream has already been ...