學習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相同。