c,c++為編譯型語言,又稱靜態語言。變數的類型在編譯時間就確定了,並且分配了相應的記憶體空間,一定程度
上,變數就代表了這塊記憶體空間,就像人名一樣。Python為動態類型語言,變數只是一個名稱而已,
不代表某個記憶體空間。
C語言中,變數就相當於一個盒子,盒子的名字就是變數,無論盒子裡的內容怎麼變,盒子及其名稱一旦
確定(編譯時間),就不可再更改。C++亦是如此,但是c++同時也引入了引用的概念,引用不是普通的變數,
它是一個的別名,一個對某個記憶體空間的引用。由於c++是靜態語言,所以一旦對某個記憶體空間綁定過後,引用就不可改變。Python中,變數全部是一個引用,一個對某個記憶體的引用
,是別名,加上其動態性的特點,所以變數可以綁定(bind)不同的記憶體空間。
三種語言的不同根本在於變數儲存方式的不同(如上所說),從而導致其他方面的差異。
比如函數傳值帶來的差異:
比如對於函數:
void foo(int a) /* c/c++ */
void foo(int &a) // c++
def foo(a) # python
)在調用foo(b)時,變數b的值被拷貝到棧中,並被賦給函數的局部變數a,然後無論局部變數a怎麼改變,
對原來的b沒有絲毫影響。
2)調用foo(b)時,變數b的別名被賦給a,這樣a也就是了b的別名。函數體裡對a的改變,直接影響到b的值。
函數結束時,a變數自動銷毀。(下面函數體裡的注釋,是在調用函數時的情況)
b = 10<br />void foo(int a){<br />a = 1 #b仍為10<br />}</p><p>void bar(int &a){<br />a = 1 #b = 10<br />}
3)調用foo(b)是,變數b被賦給a,a,b都是一塊記憶體的別名,在函數體裡,如果改變a的值,就要分情況討論了
如果a引用的是不可變(immutable)對象,那麼改變a,使得a綁定到另外一個記憶體,而對b及其綁定的對象
沒有影響;
b = "wolf"<br />def foo(a):<br />a = "egg" #對b無影響
如果a引用的是可變(mutable)對象,而且又對a實施索引修改等操作(也就是對原記憶體進行修改),那麼改變的
就是a,b所共同指向的那個記憶體空間,b所引用的空間內容就改變了,否則,a綁定到了另外一個記憶體空間,對a無影響。b = [1,2,3]<br />def foo(a):<br />a[1] = 4 #b為[1,4,3]<br />def bar(a):<br />a = [1,4,3] #b 仍為[1,2,3]
在函數結束時,a被記憶體回收機制銷毀,不複存在。