Python kwargs是按值传递还是解包dict复制数据?

Python kwargs是按值传递还是解包dict复制数据?,python,pass-by-reference,pass-by-value,keyword-argument,Python,Pass By Reference,Pass By Value,Keyword Argument,最好用例子来说明我的问题。 假设我有以下代码: 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'

最好用例子来说明我的问题。 假设我有以下代码:

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通过refreference传递,即我的dict被修改,我希望看到以下输出:

{'first':{'x':10},'second':{'a':'1'}}

{'second':{'a':'1'}


为什么我错了?

您没有将
d
传递给函数,而是将
d
中的值扩展为函数的命名参数。在所讨论的函数中,您将再次将它们作为字典接收,但是如果您将值作为命名参数传递,或者将值作为命名参数接收,那么这些值将不会分别来自或最终出现在字典中

e、 g.如果您可以修改
**kwargs
的源代码,那么在这种情况下这意味着什么

remove(first={'x': 10}, second={'a': '1'})
这没有什么意义

如果您想要完成函数名所暗示的操作,那么您需要直接将dictionary对象作为参数传递;然后它将被引用,函数中的修改将如您所期望的那样工作

def remove(dictarg):
    del dictarg['first']
d = {'first': {'x': 10}, 'second': {'a': '1'}}
remove(d)
pprint(d)

>>> {'second': {'a': '1'}}

谢谢那么,这里发生了什么,我的
d
正在扩展为函数的命名参数,并与之“分离”?