[英]Does kwargs is passed by value or does unpacking dict copies data?
最好通過例子來說明我的問題。 假設我有以下代碼:
from pprint import pprint
def remove(**kwargs):
del kwargs['first']
d = {'first': {'x': 10}, 'second': {'a': '1'}}
logger.debug(f"{pprint(d)}")
remove(**d)
logger.debug(f"{pprint(d)}")
輸出是:
{'first': {'x': 10}, 'second': {'a': '1'}}
{'first': {'x': 10}, 'second': {'a': '1'}}
那是'first'
鍵仍然存在,就好像我們已經按值傳遞了我們的 dict d ,因此調用者看不到函數內部對它的任何更改。
我期待我的 d 是通過引用傳遞的,也就是說我的 dict 被修改了,我期待看到以下輸出:
{'first': {'x': 10}, 'second': {'a': '1'}}
{'second': {'a': '1'}}
為什么我錯了?
你是不是傳遞d
的功能,你正在擴大從值d
為命名函數的自變量。 在有問題的函數中,您將再次將它們作為字典接收,但是如果您將值作為命名參數傳遞或接收值作為命名參數,這些值將不會分別來自或最終出現在字典中。
例如,如果您可以修改**kwargs
的來源,在這種情況下這意味着什么?
remove(first={'x': 10}, second={'a': '1'})
這真的沒有意義。
如果你想完成你的函數名所暗示的動作,你需要直接傳遞一個字典對象作為參數; 那么它將通過引用和函數內的修改將如您所期望的那樣工作。
def remove(dictarg):
del dictarg['first']
d = {'first': {'x': 10}, 'second': {'a': '1'}}
remove(d)
pprint(d)
>>> {'second': {'a': '1'}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.