C 和python的變數對比

2022-03-04 17:17:02 字數 2276 閱讀 3341

《c++中的this和python的self對比》基本都是針對函式而言的,從變數的角度看,也有相同之處。    

c++中,類中定義的變數一般叫做成員變數,或者說是成員屬性,它只屬於例項物件,只有例項物件才能用。加上了static關鍵字才是給類用的 稱之為靜態變數。        

而python不同,例項物件呼叫屬性時,首先是看自身是否已經構建了該屬性,如果有就用,如果沒有還會去類屬性裡找, 如果類裡有,會直接自動建立乙個和類名相同的變數(不會報錯,而是自動建立乙個同名而沒有關係的變數)。初始值和該類屬性相同。

#實驗例子:

class

stack:

y = 1

deftest(x):

print("y",x.y)

x.y = 10s =stack()

s.test()

##看看該句,遮蔽和不遮蔽有何不同

print('

s.y =

',s.y)

#print('stack.y = ',stack.y)

#print('stack().y = ',stack().y)

print(type(stack))

print(type(stack()))

print(type(s))

print(id(stack))

print(id(stack()))

print(id(s))

如果s.test()被遮蔽程式就會報錯。根據《c++中的this和python的self對比》中講到

如果是已例項呼叫方法,會自動傳入例項的「指標」self,

那麼呼叫s.test()  其實就是 執行了 self.y = 10, 這就構建了乙個例項變數y。

如果不呼叫s.test() ,就相當於沒有構建例項變數y。那邊例項就會去類中找y並將值和類中的y此時的值一致。

//----------------------------分割線-----------    

還有乙個問題就是,類屬性和例項屬性的構建時間。    

對於python而言,類屬性在類定義之後也構鍵好了,但是在成員定義之後成員屬性並沒有構建!這是為什麼呢?    

原因:        

因為python不用宣告變數,或者說它的宣告、定義、和初始化是一步到位的。而例項屬性的定義,只能是顯性的通過例項物件來定義(如self.name),

換句話說例項屬性的定義只能在類方法中進行。所以如果該函式沒有被呼叫,那麼方法中的該例項屬性就不會被構建!

所以,如果想在構建例項的時候,就想把例項的屬性都構造好,那麼就必須把例項的屬性的定義放在__init__方法中, 這樣,在構建例項的時候,會自動呼叫__init__方法,這樣就能確保例項屬性被造。        

對於c++而言,類屬性在類定義之後就構成好了這和python一樣,而成員屬性,在成員定義之後成員屬性也會構建好(構建的意思就是分配記憶體空間)    

至於,方法內定義的變數都是屬於函式的區域性變數,也是只有呼叫函式的時候才會分配空間。還有c++的類定義就只能是定義,成員變數此時是不能初始化的,初始化只能放在建構函式裡等待例項被構造的時候初始化。如果不初始化成員變數的值,就會是定義時分配的記憶體中的值。

還有,c++的類屬性,也就是靜態屬性,他的初始化應該是在定義全域性變數的位置,初始化的方法為:int a::s = 0; (a是類名,s是靜態屬性,     要注意是,此時初始化的過程還必須帶上變數型別!訪問靜態方法也好,訪問靜態屬性也好,都是類名加雙冒號實現!)

//----------------------------分割線-----------    

總結:不管是c++還是python都大致分為3種變數/屬性:(叫法我隨便說的,不要在意)    

1、類屬性(c++中叫靜態變數,python中叫類屬性)    

2、例項屬性(c++中叫成員變數,python中叫成員屬性)    

3、區域性變數(c++中叫區域性變數,python中叫區域性變數)

python編譯如何區分這三種變數/屬性?    

答:1、宣告在類中,且在方法的外部的屬性就是類屬性。    

2、宣告在方法內部,且有例項字首的屬性就是例項屬性    

3、宣告在方法內部,且沒有例項字首的屬性就是區域性變數

c++編譯如何區分這三種變數/屬性?    

答:1、宣告在類中,且在方法的外部的帶static關鍵字的屬性是類屬性。    

2、宣告在類中,且在方法的外部的不帶static關鍵字的屬性是例項屬性。    

3、宣告在方法內部,就是區域性變數

python和ruby變數作用域對比

python 1 a 0 2def f 3 a 9 4print a56 f 7 print a 列印出來是9和0 a 0 deff print af print a 列印出來是0和0 python呼叫f函式,執行print a的時候,會先在函式的作用域裡查詢是否有a這個變數,沒有找到再到全域性的作...

python和C語言小對比

因為過年耽誤了幾天和急性蕁麻疹住院了7天,耽誤了很多,住院時沒有電腦,只看書沒有實踐,感覺還是力不從心。在我看來,python的變數不需要事先定義變數型別,但是似乎如果等號右邊不是特定的格式 例如中括號 變數型別預設是字串的,如果要轉成別的型別需要轉換一下。python沒有使用 來分割,而是使用縮排...

python與c 的對比

一位正在學校做課程設計題目,要求在乙個檔案中找到給定單詞出現的位置並統計出現次數。這是乙個比較簡單的文字處理問題,於是,我給他用 python 寫了乙個,並打賭在5分鐘內用不到30行程式解決問題。我作到了,下面是程式 if name main file name raw input input th...