python小白切忌亂用表示式
阿新 • • 發佈:2020-05-31
在函式引數中亂用表示式作為預設值
Python允許給一個函式的某個引數設定預設值以使該引數成為一個可選引數。儘管這是這門語言很棒的一個功能,但是這當這個預設值是可變物件(mutable)時,那就有些麻煩了。例如,看下面這個Python函式定義:
>>> def foo(bar=[]): # bar是可選引數,如果沒有指明的話,預設值是[] ... bar.append("baz") # 但是這行可是有問題的,走著瞧… ... return bar
人們常犯的一個錯誤是認為每次呼叫這個函式時不給這個可選引數賦值的話,它總是會被賦予這個預設表示式的值。例如,在上面的程式碼中,程式設計師可能會認為重複呼叫函式foo() (不傳引數bar給這個函式),這個函式會總是返回‘baz',因為我們假定認為每次呼叫foo()的時候(不傳bar),引數bar會被置為[](即,一個空的列表)。
那麼我們來看看這麼做的時候究竟會發生什麼:
>>> foo() ["baz"] >>> foo() ["baz","baz"] >>> foo() ["baz","baz","baz"]
嗯?為什麼每次呼叫foo()的時候,這個函式總是在一個已經存在的列表後面新增我們的預設值“baz”,而不是每次都建立一個新的列表?
答案是一個函式引數的預設值,僅僅在該函式定義的時候,被賦值一次。如此,只有當函式foo()第一次被定義的時候,才講引數bar的預設值初始化到它的預設值(即一個空的列表)。當呼叫foo()的時候(不給引數bar),會繼續使用bar最早初始化時的那個列表。
由此,可以有如下的解決辦法:
>>> def foo(bar=None): ... if bar is None: # 或者用 if not bar: ... bar = [] ... bar.append("baz") ... return bar ... >>> foo() ["baz"] >>> foo() ["baz"] >>> foo() ["baz"]
內容補充:
正則字元 | 釋義 | 舉例 | ||||||||||||||||||||||||||||||
+ | 前面元素至少出現一次 | ab+:ab、abbbb 等 | ||||||||||||||||||||||||||||||
* | 前面元素出現0次或多次 | ab*:a、ab、abb 等 | ||||||||||||||||||||||||||||||
? | 匹配前面的一次或0次 | Ab?: A、Ab 等 | ||||||||||||||||||||||||||||||
^ | 作為開始標記 | ^a:abc、aaaaaa等 | ||||||||||||||||||||||||||||||
$ | 作為結束標記 | c$:abc、cccc 等 | ||||||||||||||||||||||||||||||
\d | 數字 | 3、4、9 等
|
||||||||||||||||||||||||||||||
\D | 非數字 | A、a、- 等 | ||||||||||||||||||||||||||||||
[a-z] | A到z之間的任意字母 | a、p、m 等 | ||||||||||||||||||||||||||||||
[0-9] | 0到9之間的任意數字 | 0、2、9 等 |
到此這篇關於python小白切忌亂用表示式的文章就介紹到這了,更多相關python亂用表示式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!