python起步——可變對象和不可變對象


  學習python了一小段時間,覺得整體上還是真的讓程序更好寫了。  

  學習過程中,突然想到一個問題——我之前博客寫過的一篇文章,關於不用第三個數交換a、b的問題:http://www.cnblogs.com/FreeAquar/archive/2012/07/22/2603381.html

  簡述一下不用第三個數交換a、b的函數:

 void Swap(int &a , int &b)
 {
     a+=b;
     cout<<a<<" "<<b<<endl;
     b=a-b;
     cout<<a<<" "<<b<<endl;
     a=a-b;
 }

  當然,看起來一切OK,不過當我用這樣的方式調用的時候。。。

Swap(i,i);

  a+=b后,由於a和b的地址是相同的,所以執行a+=b后,a和b還是相同的——a和b都變成2*i了

  然后第二步b=a-b后,a和b都變成了0。最終讓這種方式的交換數據失效。

 

  但是當我用python執行上述思維的代碼的時候,卻完全沒有問題,結果是1,1

a = 1
b = a

a = a + b
b = a - b
a = a - b

print a, b

  這里就遇到一點思維阻礙了,同一個對象的引用,卻可以完全無阻礙的實現上述代碼。

  這里就比較迷茫了,上網查找,終於找到問題的原因,就是題目所說的可變對象和不可變對象

  具體可以看這里:http://thomaschen2011.iteye.com/blog/1441254

  • 不可變對象:int,string,float,tuple
  • 可變對象   :list,dictionary

  也就是說a = 1后,這個對象不會變動,當a = a + b時,是會重新申請一個新的對象,修改對象的引用。

  所以,a和b就是不同的了——不論是地址還是值,自然也就不會出現上面C可能遇到的問題了。

  

  拓展試驗:

  申請一個a = 1和 b = 1,查看兩者的id,發現是相同的,就表示說是一個對象的不同引用。

  python有一點優化,就是a += 1后,a的id值改變,再a -= 1依然是與b相同。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM