kak*_*eys 0 python garbage-collection namespaces
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()
23191104
{}
{'domain_url': set([])}
>>> g()
23191104
{'domain_url': set([])}
{'domain_url': set([])}
>>>
Run Code Online (Sandbox Code Playgroud)
我g在两个调用中都没有传递任何参数,因此exclude_params应该将局部变量初始化为{}.但在第二次电话会议上,事实并非如此.
更奇怪的是,局部变量的地址在两个单独的调用中是相同的.那么旧的局部变量是重用的?? !!!
gru*_*czy 12
它不起作用.定义函数时,默认参数设置为一次且为所有函数调用之间共享.适当的习惯用法是:
def foo(some_dict=None):
if some_dict is None:
some_dict = {}
Run Code Online (Sandbox Code Playgroud)
那是因为:
def foo(arg={})
Run Code Online (Sandbox Code Playgroud)
就像任何其他指令一样,这意味着,{}在这个地方完全实例化,只做一次.