雜記 Python 兩坑

2022-08-21 13:03:13 字數 1013 閱讀 1050

近日寫**又遇到兩個 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 返回一組數中的最...