Python引數傳遞,既不是傳值也不是傳引用
面試的時候,有沒有被問到Python傳參是傳引用還是傳值這種問題?有沒有聽到過Python傳參既不是傳值也不是傳引用這種說法?一個小小的引數預設值也可能讓程式碼出現難以查詢的bug?
如果你也遇到過上面的問題,不妨我們來探究下Python函式傳遞的種種。
才對,而實際輸出看上去好像預設引數好像只生效了一次。原因在於Python的函式也是物件(萬物皆物件),這個物件只初始化一次,加上引數又是不可變物件,所以每次呼叫實際上都修改的是一個物件。
解決這個問題,推薦再引數傳遞可變物件時,預設值設定為None,在函式內部對None進行判斷後再賦予預設值。
def test(b=None):
b = b or []
b += [1]
print(b)
test() # [1]
test() # [1]
test() # [1]
再看一段程式碼。
i = 1
def test(a=i):
print(a)
i = 2
test() # 1
由於引數預設值是在函式定義時而不是函式執行時確定的,所以這段程式碼test方法的引數預設值時1而不是2。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2325/viewspace-2800599/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python的函式引數傳遞:傳值?引用?Python函式
- Java引數傳遞是傳值還是傳引用?Java
- js中函式引數值傳遞和引用傳遞JS函式
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go
- 值傳遞和引用傳遞
- 值傳遞與引用傳遞
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- go語言引數傳遞到底是傳值還是傳引用Go
- js函式引數值傳遞和引用傳遞簡單介紹JS函式
- JavaScript的值傳遞和引用傳遞JavaScript
- 快速搞懂值傳遞與引用傳遞
- JS的方法引數傳遞(按值傳遞)JS
- 引數傳遞方式必須是const引用傳遞
- Python為什麼不是傳值或傳引用? - mathsppPython
- Java - 是值傳遞還是引用傳遞Java
- Java中的值傳遞和引用傳遞Java
- Python 函式中,引數是傳值,還是傳引用?Python函式
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- 解惑4:java是值傳遞還是引用傳遞Java
- golang工作筆記(二)值傳遞與引用傳遞Golang筆記
- 關於值傳遞和引用傳遞的解釋
- java方法中只有值傳遞,沒有引用傳遞Java
- JS是按值傳遞還是按引用傳遞?JS
- C#引數傳遞之值引數C#
- 獲取url傳遞傳遞的某個引數的值
- js中 函式引數的 傳值/傳引用 問題JS函式
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- ES5中的值傳遞/引用傳遞--解釋
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- php函式引用傳遞引數的方法PHP函式
- JavaScript 獲取 url 傳遞引數值JavaScript
- url傳遞的引數值編碼
- 獲取url傳遞的引數值
- JavaScript深入之引數按值傳遞JavaScript
- JavaScript 深入之引數按值傳遞JavaScript
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- Mybatis引數傳遞MyBatis