python小知識積累

2021-10-09 12:39:43 字數 2224 閱讀 6279

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 ...