python局部变量奇怪的行为

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)

就像任何其他指令一样,这意味着,{}在这个地方完全实例化,只做一次.