Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python局部变量奇怪的行为_Python_Namespaces_Garbage Collection - Fatal编程技术网

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

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([])}
>>>
我在两个调用中都没有向
g
传递参数,因此局部变量
exclude_params
应该初始化为
{}
。 但在第二次通话中,情况并非如此


更奇怪的是,在两个单独的调用中,局部变量的地址是相同的。所以旧的局部变量被重用了

这样不行。定义函数时,默认参数将一次性设置,并在所有函数调用之间共享。恰当的习语是:

def foo(some_dict=None):
  if some_dict is None:
    some_dict = {}
那是因为:

def foo(arg={})

是一条与任何其他指令一样的指令,这意味着,
{}
在此处被精确实例化,并且只执行一次。

gruszczy是正确的。这是在Python中“咬”新人的主要内容,在这里你会发现很多关于这方面的问题

为了进一步解释,函数的定义是在定义函数时执行的,而不是在调用函数时执行的。因此,在定义函数时,参数
some_dict
也将设置为字典,而不是在调用函数时,因为这是函数定义的一部分


至少我觉得这样想很有帮助。

叹气。搜索“可变对象作为默认值”的另一个失败。我搜索了错误的关键字,我认为这与名称空间和垃圾收集有关。