日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 类成员变量是否存在_python中类变量与成员变量的使用注意点总结

發布時間:2023/12/19 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 类成员变量是否存在_python中类变量与成员变量的使用注意点总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近在用python寫一個項目,發現一個很惡心的bug,就是同由一個類生成的兩個實例之間的數據竟然會相互影響,這讓我非常不解。后來聯想到java的類有類變量也有實例變量,因此翻閱了相關資料,發現python也有類似的類變量和實例變量,下面來看看詳細的介紹。

看下面的示例代碼:

class A:

x = 0

def __init__(self):

self.y = 0

x就是類變量,y就是實例變量。

原則上是沒有錯的,但是實際用的時候就發現一些惡心的問題(也就是我找了三天的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做出修改。然后構造一個實例a,對實例a的值進行修改,最后構造實例b。

本以為這個結果是顯而易見的,然而他輸出的結果卻是:

[] 0

[] 0

['1'] 1

['1'] 0

['1'] 0

['1'] 0

問題在哪?明明x和y都是類變量,在第二組print中為什么a.x和b.x一樣,但是a.y和b.y就是不一樣呢?

想了半天悟了一個道理。。。就是對于python來說,類變量的確是所有類共有的東西。但是那是在我們用的同一個引用的情況下,比如對于[]對象的append方法就是公用一個類變量了;但是對于賦值語句來說,如果在類中對類變量使用了賦值語句,那么python就會生成一個該對象的副本,以后的操作都是基于這個副本而不會對原來的類對象造成影響。這樣就解釋的通上面的現象了。

那么為了杜絕自己忘記類變量和實例變量的區別導致本不想公用變量的時候公用了變量,最好的辦法就是在每個類中使用變量的時候重新初始化一下,這樣就不會導致意外了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

總結

以上是生活随笔為你收集整理的python 类成员变量是否存在_python中类变量与成员变量的使用注意点总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。