在使用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 小黃的座標 座標 小...