Python成員變量
定義的成員變量,如果通過類名訪問,影響的是全局的靜態變量
如果通過實例(self)訪問,影響的是當前實例的對象
在所有成員函數之外直接定義的變量(不加self)將成為類變量
如果成員函數內通過self賦值過,則為實例變量
對於容器型數據結構,如列表、map、元組,類變量和實例變量的差異較大。如下程序:
class c():
w = 0
s = []
def __init__(self):
pass
def setw(self,x):
self.w = x
def appends(self,x):
self.s.append(x)
if __name__ == "__main__":
a = c()
b = c()
a.setw(1)
b.setw(2)
a.appends(1)
print(a.w)
print(a.s)
print(b.w)
print(b.s)
此時輸出為
1
[1]
2
[1]
在setw函數中,w的值通過self進行了賦值,此時w變成了實例變量
而對於s,雖然在成員函數中修改了s的內容,但沒有給s賦值(我理解為變量指針沒有改變,只是改變指針指向的地址里的內容),因此此時s仍然是類變量,對a實例中s的修改,影響了b實例
如果構造函數改為:
def __init__(self):
self.s = [1,2,3]
則輸出為
1
[1, 2, 3, 1]
2
[1, 2, 3]
或者將appends函數改為:
def appends(self,x):
self.s = [x]
self.s.append(x)
此時輸出為:
1
[1]
2
[]
此時s變成了實例變量,對a實例的修改不影響b實例
類變量可以通過類名直接訪問,對於沒有在成員函數內定義過的類變量,對其修改會影響所有的類實例