您好,登錄后才能下訂單哦!
Python中數據模型與對象模型的關系是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
對象有三個要素:編號(identity)、類型(type)、值(value)。
編號就是對象的內存地址,從創建后就不會改變。is運算符用來比較2個對象的編號。id()函數返回對象編號的整數表示。
identity也可以翻譯為身份,對象身份。
類型決定了可以對對象做哪些操作,也定義了對象的可能值,比如int
和bool
類型的值就不一樣。type()
函數返回對象類型。很多人會誤以為Python是弱類型語言,其實Python是強類型語言,這個誤解的真實原因是,Python不需要編譯,不需要提前知道變量的類型,在運行時才檢查類型,這應該叫做動態語言。
JavaScript是弱類型語言,在Python中1+"2"會運行失敗,在JavaScript中能運行成功。
類型在創建后也不會改變,雖然可以進行類型轉換,但轉換實際會產生新對象:
a = 1 print(id(a)) print(id(str(a))) print(id(a))
結果為:
140715000207008 2136059506160 140715000207008
對象三要素中唯一能改變的就只有值了。官網有一句正確的廢話:允許改變值的對象是mutable
(可變的),不允許改變值的對象是immutable
(不可變的)。它的意義在于當不可變對象的值是對可變對象的引用時,該如何判斷對象的可變性?結論是不可變對象仍然是不可變的,因為這個引用是不能變的,但是我們通常會認為這個不可變對象的值是可變的,尤其是對象容器。對象類型也會決定是否可變,比如numbers
、strings
、tuples
是不可變的,dictionaries
、lists
是可變的。
有些對象包含了對其他對象的引用,這叫做containers
對象容器,比如tuples
、lists
、dictionaries
。大多數情況下,我們說容器的值,說的是引用的對象的值,而不是引用編號。但討論容器可變性時,則僅僅是指容器直接包含的引用編號。比如tuple
是不可變的,如果它包含了對一個可變對象的引用后,當該可變對象改變時容器的值也會改變。
對象不會被顯式銷毀,但是它們會被當做垃圾回收,只要不存在對象引用,這就是Python垃圾回收機制!垃圾回收機制比較復雜,比如循環引用,實際上已經沒有使用了,但是還存在引用等,涉及到算法規則,等寫完Python進階,在寫Python原理時做進一步研究。
Python垃圾回收機制不是銀彈,不能解決所有問題,所以在引用外部資源,比如打開文件后,我們需要注意顯式close,防止資源始終占用內存,無法釋放,造成內存泄漏。close除了手動調用close()
方法外,也可以使用with來自動close。
使用try...except可能會讓對象繼續存活。
對象的類型幾乎決定了對象的一切行為,甚至是對象編號,比如對于不可變類型:
a = 1 b = 1
a和b可能會指向同一個值為1的對象,也可能會指向兩個不同的值為1的對象,這取決于具體實現。
但是對于可變類型:
c = [] d = []
c和d一定會指向兩個不同的單獨的空列表。
注意c = d = [] 則是將同一個對象賦值給 c 和 d。
關于Python中數據模型與對象模型的關系是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。