1. 程式人生 > >Python中類內__init__外定義類的變數

Python中類內__init__外定義類的變數

Python中類內定義類的變數中的bug

2018-12-5

今天看到有人在類內的初始化函式__init_(self,…)之前定義類的變數:
在這裡插入圖片描述
不是很明白為什麼要在__init__()之外先定義一個變數x。於是就自己做實驗測試了一下,之前定義的x=1和__init__()函式內的self.x=_x有何區別。
如下方式定義類A,
在這裡插入圖片描述
1. 內外變數雖然有相同的變數名,但分配不同地址
定義了A的物件a=A(1)
在這裡插入圖片描述
可以看到a.x是經過__init__()函式初始化過的物件的變數,而A.x是類A本身的變數,與物件a並無關係。
id()函式查看了變數的地址,a.x

A.x的地址並不相同。

2. 當內外變數值一致時,可能會是相同地址
當我再次定義一個A的物件b,b=A(2),檢視b.x的地址,發現id(b.x)=id(A.x)
在這裡插入圖片描述
如上面所顯示的,b.x和A.x的地址竟然是一樣的。
於是我又改變了b.x的值,
在這裡插入圖片描述
然後我又發現當我改變b.x的值為5,使其不等於A.x時,b.x的地址竟然又改變。
我就很不明白這是怎麼一回事,後來在網上百度。看到其他網友關於id函式的解釋:
在這裡插入圖片描述
引用連結:https://www.cnblogs.com/dplearning/p/5998112.html
也就是說,我們發現當a.x=A.x=2時,二者的記憶體是一樣的,和類中變數的定義是無關的。只不過是python對於小型整數分配記憶體中的一種資源的共享。


然後,我就用大型的整數又做了一次實驗:
在這裡插入圖片描述
a.x=b.x=A.x=1000,用id函式再次看三個變數的記憶體就發現它們是相互無關的。

就是這樣了,以後還是可以放心大膽的在類內為類本身定義變量了。