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