近日寫**又遇到兩個 python 的坑,覺得值得記錄。
python 裡傳參的實現是 assignment,但由於 python 裡都是物件,除了幾個基本型別,assignment 基本都是引用的賦值,因此在遞迴裡,你傳的引數很可能就被下一層修改掉,例如:
def some_func(a):
# do your routines
some_func(a)
如果這個a
是個 mutable 的物件,而你的函式裡對a
有修改,那每一層遞迴都是修改同乙個物件a
。
我是在寫乙個解數獨的程式時發現這個問題的。這個程式裡有將 numpyndarray
作為遞迴函式的引數,因此它在遞迴過程中被各種修改,完全亂了套。最後把呼叫遞迴傳入a
的地方換成a.copy()
就解決了問題。
這個問題本應是幾乎所有程式語言的問題,因為計算機不能精確表示大多數浮點數,例如經典的0.1 + 0.2 != 0.3
。但這個問題在 python 裡其實可以得到解決,就是使用 fraction 模組。我們將所有有理浮點數都表示為分數,就能完全保證計算過程中精度不會丟失。
# 使用 float 會丟失精度
>>> x = 0.1
>>> x == x * 3 / 3
false
# 使用 fraction 則不會
>>> from fraction import fraction
>>> x = fraction('0.1')
>>> x == x * 3 / 3
true
注意,這裡是fraction('0.1')
而不是fraction(0.1)
,後者還是丟失精度的,因為0.1
這個字面量在 python 裡本身就不是準確的0.1,所以只能用字串。
(本文完)
python 學習雜記
一 模組匯入問題 如果在機器上安裝了多個版本的python,往往會有匯入錯誤,例如一般的python程式頭都寫的是 usr bin env python 這個實際是 usr bin python 但是如果新版本的python是後安裝的,且沒有 prifex usr 可能這個鏈結仍指向老版本pytho...
Python學習雜記
學習資料 python核心程式設計 第二版 class c object foo 100 name 是給定類的字元名字,它適用於那種只需要字串 類物件的名字 而非類物件本身的情況。內建的型別也有這個屬性。type 123 str type 123 name str type type 123 typ...
Python基礎雜記
1 地板除 2 字串不轉義 r 表示字串 不轉義 3 elif意思為else if 4 isinstance obj,class or tuple 判斷obj是否符合後面的型別 5 乘方運算子 數學方法 pow x,y 和pow x,y,z abs x 求絕對值 max a,b,c 返回一組數中的最...