Python 字典的開箱(**)詳解:新手指南
更新日期: 2025 年 1 月 23 日
本文為 python 打包與解構 系列文,第 5 篇:
- 理解 Python 函數中的預設值機制
- Python 函數參數詳解:位置引數與關鍵字引數的新手指南
- 理解 Python 函數中的 / 與 * 用法
- Python 串列開箱(Unpacking)詳解:新手指南
- Python 字典的開箱(**)詳解:新手指南 👈進度
在 Python 編程中,字典(Dictionary) 是一種以 鍵-值對(key-value pair) 形式存儲數據的強大數據結構。
當我們處理函數參數、合併字典或傳遞可變數量的關鍵字引數時,**
開箱運算子(也稱為雙星號或雙星運算子)起到了至關重要的作用。
對於剛開始學習 Python 的新手來說,理解並掌握字典的開箱用法,將大大提升你在開發過程中的效率和靈活性。
本文將詳細介紹 Python 中的字典開箱,包括其基本概念、使用方法、實際應用和注意事項,並提供豐富的示例,幫助你在實際開發中靈活運用。
什麼是字典開箱(**
)?
定義
字典開箱是指使用 **
運算子,將字典中的鍵-值對展開,並將其作為關鍵字引數傳遞給函數,或者在創建新字典時合併多個字典。
特點
- 函數參數傳遞:允許我們將字典中的鍵-值對作為關鍵字引數傳遞給函數。
- 合併字典:可以將多個字典的內容合併到一個新的字典中。
- 靈活性:提高代碼的可讀性和靈活性,使函數調用和字典操作更加簡潔。
字典開箱的基本語法
在函數調用中字典開箱
def function_name(**kwargs):
# 函數體
function_name(**dictionary)
**kwargs
:在函數定義中,表示接受任意數量的關鍵字引數,存儲為字典。**dictionary
:在函數調用時,將字典中的鍵-值對開箱為關鍵字引數。
在創建新字典時開箱
new_dict = {**dict1, **dict2}
{**dict1, **dict2}
:將兩個字典的鍵-值對開箱並合併到一個新的字典中。
在函數參數中使用字典開箱
定義函數並使用 **kwargs
接收可變關鍵字引數
示例:
def greet(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
greet(name='Alice', age=30, city='Taipei')
輸出:
name: Alice
age: 30
city: Taipei
解釋:
**kwargs
:函數可以接收任意數量的關鍵字引數,並以字典形式存儲。- 在函數內部,可以遍歷
kwargs
,訪問鍵和值。
使用字典開箱傳遞參數
示例:
def greet(name, age, city):
print(f"姓名:{name}")
print(f"年齡:{age}")
print(f"城市:{city}")
info = {'name': 'Alice', 'age': 30, 'city': 'Taipei'}
greet(**info)
輸出:
姓名:Alice
年齡:30
城市:Taipei
解釋:
**info
:將字典info
中的鍵-值對開箱為關鍵字引數,傳遞給函數greet
。
混合使用位置參數和開箱參數
示例:
def greet(greeting, name):
print(f"{greeting}, {name}!")
info = {'name': 'Alice'}
greet('Hello', **info)
輸出:
Hello, Alice!
解釋:
- 位置參數
'Hello'
傳遞給參數greeting
,開箱字典將'Alice'
傳遞給參數name
。
合併字典
使用 **
開箱運算子合併字典
示例:
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged_dict = {**dict1, **dict2}
print(merged_dict)
輸出:
{'a': 1, 'b': 3, 'c': 4}
解釋:
- 將
dict1
和dict2
中的鍵-值對開箱並合併到新的字典merged_dict
中。 - 如果存在相同的鍵,後面的值會覆蓋前面的值,因此
'b'
的值為3
。
在 Python 3.9+ 中使用 |
運算子合併字典
示例:
# 需要 Python 3.9 或更高版本
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged_dict = dict1 | dict2
print(merged_dict)
輸出:
{'a': 1, 'b': 3, 'c': 4}
解釋:
|
運算子在 Python 3.9 中被引入,用於合併字典。- 與使用
**
開箱運算子效果相同。
實際應用示例
構建 HTTP 請求的參數
示例:
def send_request(url, **params):
print(f"發送請求到 {url}")
for key, value in params.items():
print(f"{key} = {value}")
query_params = {'search': 'python', 'page': 2}
send_request('https://example.com', **query_params)
輸出:
發送請求到 https://example.com
search = python
page = 2
解釋:
- 使用
**query_params
將字典開箱為關鍵字引數,傳遞給函數send_request
。
配置文件的加載與覆蓋
示例:
default_config = {'host': 'localhost', 'port': 8080}
user_config = {'port': 9090, 'debug': True}
config = {**default_config, **user_config}
print(config)
輸出:
{'host': 'localhost', 'port': 9090, 'debug': True}
解釋:
- 將默認配置和用戶配置合併,後者覆蓋前者相同的鍵。
創建類實例時傳遞參數
示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
info = {'name': 'Alice', 'age': 30}
person = Person(**info)
print(person.name) # 輸出:Alice
print(person.age) # 輸出:30
解釋:
- 使用
**info
將字典開箱為關鍵字引數,傳遞給類的構造函數。
使用注意事項
鍵名需要與參數名匹配
- 在函數調用時,字典中的鍵名必須與函數的參數名一致,否則會引發錯誤。
示例:
def greet(name, age):
print(f"姓名:{name}, 年齡:{age}")
info = {'username': 'Alice', 'age': 30}
greet(**info)
# TypeError: greet() got an unexpected keyword argument 'username'
解決方案:
- 確保字典的鍵名與函數參數名對應。
處理重複的鍵
- 在合併字典時,如果存在重複的鍵,後面的值會覆蓋前面的值。
示例:
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3}
merged_dict = {**dict1, **dict2}
print(merged_dict) # 輸出:{'a': 1, 'b': 3}
適用於 Python 3.x
- 字典開箱運算子
**
用於合併字典的功能在 Python 3.5 及以上版本中可用。 - 在較低版本的 Python 中,需要使用
dict.update()
方法或其他方式合併字典。
常見錯誤與調試
TypeError: got multiple values for keyword argument
- 錯誤原因:在函數調用時,直接指定的關鍵字引數與開箱字典中的鍵重複。
示例:
def greet(name, age):
print(f"姓名:{name}, 年齡:{age}")
info = {'name': 'Alice', 'age': 30}
greet(name='Bob', **info)
# TypeError: greet() got multiple values for argument 'name'
解決方案:
- 避免直接指定的參數與開箱字典中的鍵重複,或在開箱字典前覆蓋鍵值。
正確示例:
greet(**info)
SyntaxError: invalid syntax
- 錯誤原因:在 Python 3.5 以下版本中使用了字典開箱運算子。
解決方案:
- 升級到 Python 3.5 或更高版本,或者使用其他方式合併字典。
結論
**
開箱運算子 是 Python 中處理字典的重要工具,允許我們在函數調用時開箱字典為關鍵字引數,或在創建新字典時合併多個字典。- 主要優勢:
- 提高代碼的簡潔性和可讀性。
- 增強函數調用的靈活性。
- 方便地合併和更新字典。
- 使用注意事項:
- 確保字典的鍵名與函數參數名一致。
- 處理重複鍵時,注意值的覆蓋順序。