c,c++和python變數討論

來源:互聯網
上載者:User

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被記憶體回收機制銷毀,不複存在。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.