python局部变量奇怪的行为
python专家能否向我解释以下输出python局部变量奇怪的行为,python,namespaces,garbage-collection,Python,Namespaces,Garbage Collection,python专家能否向我解释以下输出 def modify_dict(exclude_params): exclude_params["domain_url"] = set() def g(exclude_params={}): print id(exclude_params) print exclude_params modify_dict(exclude_params) print exclude_params return None &g
def modify_dict(exclude_params):
exclude_params["domain_url"] = set()
def g(exclude_params={}):
print id(exclude_params)
print exclude_params
modify_dict(exclude_params)
print exclude_params
return None
>>> g()
23191104
{}
{'domain_url': set([])}
>>> g()
23191104
{'domain_url': set([])}
{'domain_url': set([])}
>>>
我在两个调用中都没有向g
传递参数,因此局部变量exclude_params
应该初始化为{}
。
但在第二次通话中,情况并非如此
更奇怪的是,在两个单独的调用中,局部变量的地址是相同的。所以旧的局部变量被重用了 这样不行。定义函数时,默认参数将一次性设置,并在所有函数调用之间共享。恰当的习语是:
def foo(some_dict=None):
if some_dict is None:
some_dict = {}
那是因为:
def foo(arg={})
是一条与任何其他指令一样的指令,这意味着,
{}
在此处被精确实例化,并且只执行一次。gruszczy是正确的。这是在Python中“咬”新人的主要内容,在这里你会发现很多关于这方面的问题
为了进一步解释,函数的定义是在定义函数时执行的,而不是在调用函数时执行的。因此,在定义函数时,参数some_dict
也将设置为字典,而不是在调用函数时,因为这是函数定义的一部分
至少我觉得这样想很有帮助。叹气。搜索“可变对象作为默认值”的另一个失败。我搜索了错误的关键字,我认为这与名称空间和垃圾收集有关。