如何阻止具有默认值的函数的列表类型参数在后续调用中保持值?
How to stop function's list-type argument with default value from holding value on subsequent calls?
我有一个函数,它递归调用自身以从具有多层嵌套对象(字典、列表和其他平面 [int/string/etc.] 数据类型的字典中提取和 return 内容).在它的末尾,它 return 是一个特定对象名称的平面二维列表,为此,该函数有一个参数来存储传递给嵌套调用的列表,然后 return 它与它发现的东西附加到列表中。当被用户调用时,他们不需要传递任何东西来设置这个参数,它的默认值是一个空列表 []
。但是,当我多次调用此函数时,列表保留其内容,我最终将下一次调用的项目附加到先前调用的结果中。
这解释了原因和问题。下面是一个非常简单的示例函数,它演示了这一点,没有嵌套调用:
def test(arg1=[]):
arg1.append('bob')
return arg1
多次调用会导致:
a=test()
a=test()
a=test()
print(a)
>>['bob', 'bob', 'bob']
# Whereas I am expecting it to return:
>>['bob']
我可以将功能更改为以下解决问题的功能,但我想知道执行此操作的正确方法吗? (或者如果这个 是 正确的方法?- 感觉有点傻)
def test(arg1=[]):
arg1.append('bob')
arg1_ = arg1
arg1 = []
return arg1_
默认参数在Python中是可变的,你可以认为它们属于全局范围。你想要这个:
def test(arg1=None):
if arg1 is None:
arg1 = []
arg1.append('bob')
return arg1
我有一个函数,它递归调用自身以从具有多层嵌套对象(字典、列表和其他平面 [int/string/etc.] 数据类型的字典中提取和 return 内容).在它的末尾,它 return 是一个特定对象名称的平面二维列表,为此,该函数有一个参数来存储传递给嵌套调用的列表,然后 return 它与它发现的东西附加到列表中。当被用户调用时,他们不需要传递任何东西来设置这个参数,它的默认值是一个空列表 []
。但是,当我多次调用此函数时,列表保留其内容,我最终将下一次调用的项目附加到先前调用的结果中。
这解释了原因和问题。下面是一个非常简单的示例函数,它演示了这一点,没有嵌套调用:
def test(arg1=[]):
arg1.append('bob')
return arg1
多次调用会导致:
a=test()
a=test()
a=test()
print(a)
>>['bob', 'bob', 'bob']
# Whereas I am expecting it to return:
>>['bob']
我可以将功能更改为以下解决问题的功能,但我想知道执行此操作的正确方法吗? (或者如果这个 是 正确的方法?- 感觉有点傻)
def test(arg1=[]):
arg1.append('bob')
arg1_ = arg1
arg1 = []
return arg1_
默认参数在Python中是可变的,你可以认为它们属于全局范围。你想要这个:
def test(arg1=None):
if arg1 is None:
arg1 = []
arg1.append('bob')
return arg1