python 函式引數傳遞方式並不像其他語言那樣是 指標/引用 和 值傳遞, 而是 物件引用傳遞,
本質上是 「引用傳遞」, 可以說 python 中不存在 值傳遞,而是存在 「不可變物件」
容易誤判的操作
容易被誤認為是 引用傳遞 的操作:
def case1(l: list[int]) -> none:
alist = list()
case1(alist)
print(alist) # 輸出: [233], 列表在函式內被改變了, 很像是 「引用/指標傳遞」 的效果
容易被誤認為是 值傳遞 的操作:
def case2(s: str) -> none:
s += "dola"
print(s)
astring = ""
case2(astring)
print(s) # 輸出仍然是 空字串,但函式內的 輸出為 「dola」, 很像是 「值傳遞」 的效果
物件引用傳遞
上面的兩個例子中,實際本質都是其他語言中的 「引用傳遞」。
第乙個例子比較好理解,alist 是乙個物件的引用,與函式內的l, 指向的是同乙個物件。
第二個例子 astring 其實也是物件的引用,不一樣的是,這個物件是 不可變物件,第乙個例子的物件是可變物件。
python 規定了 str 是 不可變物件,對不可變物件進行操作,都需要重新拷貝乙份。
也就是說,函式 def case2(s: str) 中, 一開始, s 和 函式外的 alist 指向的是同乙個物件,當執行
s += "dola" 時,拷貝了乙個新的物件進行操作,因此在此操作後,s 和 函式外的 alist 指向的是不同的物件了。
效果上,就像是其他語言的值傳遞。
可變物件 和 不可變物件
在 python中,對 資料型別進行了一層封裝, 所有資料型別都是物件,分為兩類:
可變物件:list, dict, set
不變物件:bool, int, float, tuple, str, frozenset
因此,資料物件的操作,直譯器會根據其物件型別進行不同的操作。
對於 可變物件:會直接操作引用所指向物件
預設引數只計算 1 次
def test(l=[1]):
print(l)
test() # [1, 1]
test() # [1, 1, 1]
可變引數 *args, **kwargs
args 會被打包成 tuple
kwargs 會被打包成 dict
C 引用方式傳參,傳值方式傳參( )
1 引用方式傳參 引用相當於是外部變數的別名,實際操作的就是該變數,即在函式內對該變數進行修改的話,在外部該變數也會相應被修改。外部變數的值也會被修改 void changeref int ref 2 傳值方式傳參 實際上是複製了乙個外部變數的副本進入函式中,在函式內操作的為該副本,對該變數的修改並...
Python 函式引數傳參方式
目錄 函式定義 呼叫 函式引數傳參 函式引數可變引數傳參 例子 引數解構 呼叫 預設值引數傳參 關鍵字引數的可變引數 有位置可變引數和關鍵字可變引數位置可變引數在形參前使用乙個星號 關鍵字可變引數在形參前使用兩個星號 位置可變引數和關鍵字可變引數都可以收集若干個實參,位置可變引數收集形成乙個tupl...
Mybatis傳參方式
mybatis傳多個引數 三種解決方案 據我目前接觸到的傳多個引數的方案有三種。第一種方案 dao層的函式方法 1public user selectuser string name,string area 123select from user user t where user name and...