簡體   English   中英

kwargs 是按值傳遞還是解包 dict 復制數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM