Python - varibale # 第一次玩 python 是在 samba porting 時,用來做 auto-testing。 看中的是 python 比起 bash 豐富些的封裝能力,感覺 code 重用的效果會比較好, 比起 c++ 寫起來彈性也好一些。然而在一個比較大的 project 當中, 修正 pylint 的錯誤時,一邊 trace code,一邊浮起了很多疑問。 想像在看 code 時,看到這樣的一段: ... def func(self, ...): ... x.a = self.b() ... 怎麼知道 x 是什麼?如果在檔案中有很多個 x 有關係的是哪些? 怎麼知道 x.a 是什麼?找到了 x 後,怎麼找到 x.a ? self 是什麼?為什麼有的時候要傳,有的時候又不用? Reference or value # 在 c/c++ 中,常會說 "call by reference" or "call by value"。其實只要有變數取用、 傳遞等行為,就需要問到底傳的是 reference 還是 value。 比方說 a = 1 b = a a = 2 print(b) 執行結果 b == 1 ,看起來並不會因為 a 的值改變了而改變。 對於學 c/c++ 或 javascript 的人來說,好像都滿直覺的。 但這滿有趣的,並非所有語言都是如此,在 Makefile 當中,就不會是這樣的結果。 而如果換成是: a = [] b = a a.append(1) print(b) 則會得到 b == [1] 的結果。怎麼好像又會隨著 a 一起改變呢? 這對於 javascript 也是滿直覺的, 所有型別分成兩大類, primitive type 在 b = a 食,會發生 value 的複製;而另一類都是 object 的子孫,在 b = a 時, 會發生的是 reference 的複製。因此未來作用在同一個 object 上的改變, 都會影響到擁有這個 reference ...