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函式
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- 值傳遞和引用傳遞
- go語言引數傳遞到底是傳值還是傳引用Go
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- 引數傳遞方式必須是const引用傳遞
- Python為什麼不是傳值或傳引用? - mathsppPython
- JavaScript的值傳遞和引用傳遞JavaScript
- 快速搞懂值傳遞與引用傳遞
- Java的值傳遞和引用傳遞Java
- JS的方法引數傳遞(按值傳遞)JS
- Day30--值傳遞和引用傳遞
- Java - 是值傳遞還是引用傳遞Java
- ABAP 方法呼叫的引數傳遞裡,透過引用傳遞的方式,能修改原始引數值嗎?
- golang工作筆記(二)值傳遞與引用傳遞Golang筆記
- 解惑4:java是值傳遞還是引用傳遞Java
- 關於值傳遞和引用傳遞的解釋
- js中 函式引數的 傳值/傳引用 問題JS函式
- 引數傳遞
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- C#|.net core 基礎 - 值傳遞 vs 引用傳遞C#
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- php函式引用傳遞引數的方法PHP函式
- JavaScript 獲取 url 傳遞引數值JavaScript
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- [Python] 傳遞引數前面的*或**Python
- Python怎麼傳遞不定引數Python
- Mybatis引數傳遞MyBatis
- JavaScript獲取url傳遞的引數值JavaScript
- python中函式的引數傳遞Python函式
- c++指標傳遞與引用傳遞C++指標
- C#程式設計:ref【引數按引用傳遞】C#程式設計
- Java是值傳遞還是引用傳遞,又是怎麼體現的Java
- python的賦值傳遞Python賦值
- React事件傳遞引數React事件
- 路由元件傳遞引數路由元件
- 關於String是值傳遞還是引用傳遞,talk is cheap, just show codes
- 這一次,徹底解決Java的值傳遞和引用傳遞Java