Python 中的函數(shù)參數(shù)如何傳遞?
參數(shù)傳遞機(jī)制
Python 使用的是“按對象引用傳遞”(pass by object reference)的方式。這意味著當(dāng)你將一個對象作為參數(shù)傳遞給函數(shù)時,你實(shí)際上是在傳遞該對象的引用而不是副本。因此,如果在函數(shù)內(nèi)部修改了可變對象(如列表、字典),這些修改會反映到外部的對象上;而對于不可變對象(如整數(shù)、字符串、元組),由于它們不能被修改,所以不會影響原始對象。
參數(shù)類型
位置參數(shù)(Positional Arguments) 這是最常見的參數(shù)傳遞方式,調(diào)用函數(shù)時按照定義順序傳遞參數(shù)。
def greet(name, message):
print(f"Hello {name}, {message}")
greet("Alice", "Good morning!")
關(guān)鍵字參數(shù)(Keyword Arguments) 通過指定參數(shù)名來傳遞參數(shù)值,這樣可以不按照定義順序傳遞參數(shù)。
def greet(name, message):
print(f"Hello {name}, {message}")
greet(message="Good morning!", name="Alice")
默認(rèn)參數(shù)(Default Arguments) 定義函數(shù)時為參數(shù)提供默認(rèn)值,當(dāng)調(diào)用函數(shù)時沒有提供對應(yīng)的參數(shù)值,則使用默認(rèn)值。
def greet(name, message="Good day!"):
print(f"Hello {name}, {message}")
greet("Bob") # 使用默認(rèn)消息
greet("Charlie", "How are you?") # 覆蓋默認(rèn)消息
可變數(shù)量的參數(shù)(*args 和 kwargs)
*args:允許你傳入任意數(shù)量的位置參數(shù),這些參數(shù)會被收集到一個元組中。
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3)) # 輸出6
*kwargs:允許你傳入任意數(shù)量的關(guān)鍵字參數(shù),這些參數(shù)會被收集到一個字典中。
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30)
可變對象 vs 不可變對象
對于不可變對象(如整數(shù)、字符串、元組),在函數(shù)內(nèi)部對參數(shù)的任何改變都不會影響到外部的變量,因為實(shí)際上是在操作一個新的對象。
def modify_string(s):
s += " world"
print(s) # 輸出 "hello world"
original = "hello"
modify_string(original)
print(original) # 輸出 "hello"
對于可變對象(如列表、字典),在函數(shù)內(nèi)部對參數(shù)的改變會影響到外部的變量,因為兩者指向同一個對象。
def append_to_list(lst):
lst.append(4)
my_list = [1, 2, 3]
append_to_list(my_list)
print(my_list) # 輸出 [1, 2, 3, 4]
通過理解這些概念,你可以更好地控制函數(shù)參數(shù)的傳遞方式,并根據(jù)需要選擇最合適的參數(shù)傳遞策略。無論是簡單的函數(shù)調(diào)用還是復(fù)雜的數(shù)據(jù)處理邏輯,正確地使用參數(shù)傳遞機(jī)制都是至關(guān)重要的。