python的結構體class與記憶體的坑

2021-10-08 12:37:18 字數 724 閱讀 4213

在使用python語言程式設計時,遇到的bug難修改的不多,大多數都可以用編輯器強大的debug功能解決。然而,有一系列問題卻十分麻煩,這些問題懷疑和語言底層的記憶體自動管理和指標系統有關係。今天就遇到了乙個這樣的大坑:

python中的類不加任何修飾,可以當作c語言中的結構體用:

class

fakerstruct

: var1 =

1 var2 =

100

然而,這種結構體最大的問題在於無論怎麼宣告新的變數,只要你的**上只有這乙個,底層記憶體也只存有乙個,因此都只有這乙個結構體被修改和使用,只是可能有大量的新指標指向它。

例如:

faker0 = fakerstruct

faker1 = fakerstruct

faker2 = fakerstruct

這三個語句無論是直接這樣表示還是放在類中表示,到最後修改的變數都是一樣的,因為只有乙個記憶體被建立。

其實,想要讓上述class實現建立新的記憶體,可以這樣呼叫:

faker0pro = fakerstruct(

)faker1pro = fakerstruct(

)faker2pro = fakerstruct(

)

python的自動記憶體管理機制,很容易讓人在複雜編碼中陷入記憶體陷阱,需要時刻注意這些陷阱。

關於c 的結構體struct與class的區別

c 結構體 struct c 中結構型別和類型別在語法上非常相似,他們都是一種資料結構,都可以包括資料成員和方法成員。結構和類的區別 1 結構是值型別,它在棧中分配空間 而類是引用型別,它在堆中分配空間,棧中儲存的只是引用。2 結構型別直接儲存成員資料,讓其他類的資料位於對中,位於棧中的變數儲存的是...

C 類class和結構體struct區別

參考改編自 c 語言繼承了c語言的struct,並且加以擴充。在c語言中struct是只能定義資料成員,而不能定義成員函式的。而在c 中,struct類似於class,在其中既可以定義資料成員,又可以定義成員函式。在c 中,struct與class基本是通用的,唯一不同的是如果使用class關鍵字,...

swift3 類class與結構體struct

swift 中類和結構體有很多共同點。共同處在於 與結構體相比,類還有如下的附加功能 定義類class class 角色 var 小黃 角色 小黃.安全區角色 id 小黃 money 999 當前角色是小黃,money有999 定義結構體struct struct 座標 var 小黃的座標 座標 小...