python中類變量與成員變量的使用注意點總結(jié)
前言
最近在用python寫一個項目,發(fā)現(xiàn)一個很惡心的bug,就是同由一個類生成的兩個實例之間的數(shù)據(jù)竟然會相互影響,這讓我非常不解。后來聯(lián)想到java的類有類變量也有實例變量,因此翻閱了相關(guān)資料,發(fā)現(xiàn)python也有類似的類變量和實例變量,下面來看看詳細的介紹。
看下面的示例代碼:
class A: x = 0 def __init__(self): self.y = 0
x就是類變量,y就是實例變量。
原則上是沒有錯的,但是實際用的時候就發(fā)現(xiàn)一些惡心的問題(也就是我找了三天的bug)。。。比如下面的代碼:
class A: x = [] y = 0 def __init__(self): pass def add(self): self.x.append('1') self.y+=1 a=A() print a.x,a.y print A.x,A.y a.add() print a.x,a.y print A.x,A.y b=A() print b.x,b.y print A.x,A.y
這里很明顯x和y都是類變量,add的作用是分別對x和y做出修改。然后構(gòu)造一個實例a,對實例a的值進行修改,最后構(gòu)造實例b。
本以為這個結(jié)果是顯而易見的,然而他輸出的結(jié)果卻是:
[] 0 [] 0 ['1'] 1 ['1'] 0 ['1'] 0 ['1'] 0
問題在哪?明明x和y都是類變量,在第二組print中為什么a.x和b.x一樣,但是a.y和b.y就是不一樣呢?
想了半天悟了一個道理。。。就是對于python來說,類變量的確是所有類共有的東西。但是那是在我們用的同一個引用的情況下,比如對于[]對象的append方法就是公用一個類變量了;但是對于賦值語句來說,如果在類中對類變量使用了賦值語句,那么python就會生成一個該對象的副本,以后的操作都是基于這個副本而不會對原來的類對象造成影響。這樣就解釋的通上面的現(xiàn)象了。
那么為了杜絕自己忘記類變量和實例變量的區(qū)別導致本不想公用變量的時候公用了變量,最好的辦法就是在每個類中使用變量的時候重新初始化一下,這樣就不會導致意外了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
R語言 vs Python對比:數(shù)據(jù)分析哪家強?
R語言和Python在數(shù)據(jù)分析方法都各有所長,兩者現(xiàn)在可以說是都非常熱門的,那么這篇文章就來給大家總結(jié)介紹關(guān)于R語言和Python數(shù)據(jù)分析的相關(guān)資料,并給大家推薦了一些相關(guān)的書籍學習,需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-11-11pandas數(shù)據(jù)的合并與拼接的實現(xiàn)
Pandas包的merge、join、concat方法可以完成數(shù)據(jù)的合并和拼接,本文主要介紹了這三種實現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Python圖像處理實現(xiàn)兩幅圖像合成一幅圖像的方法【測試可用】
這篇文章主要介紹了Python圖像處理實現(xiàn)兩幅圖像合成一幅圖像的方法,結(jié)合實例形式分析了Python使用Image.blend()接口與Image.composite()接口進行圖像合成的相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Python基礎常用內(nèi)建函數(shù)圖文示例解析
這篇文章主要為大家Python常用內(nèi)建函數(shù),文中通過圖例詳細的給大家作出了講解分析,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09