在Python中,为什么函数参数在函数调用之间保持其值
我对Python还相当陌生,我无法对我得到的结果了如指掌 使用以下代码:在Python中,为什么函数参数在函数调用之间保持其值,python,Python,我对Python还相当陌生,我无法对我得到的结果了如指掌 使用以下代码: def func(a,b=set()): res=list() for i in a: if i not in b: res.append(i) b|={i} return res print(func([1,1,2,2,3,4])) print(func([1,1,2,2,3,4])) 我得到了输出: [1,2,3,4] []
def func(a,b=set()):
res=list()
for i in a:
if i not in b:
res.append(i)
b|={i}
return res
print(func([1,1,2,2,3,4]))
print(func([1,1,2,2,3,4]))
我得到了输出:
[1,2,3,4]
[]
我把“print(b)”放在“res=list()”上面,得到了输出:
set()
[1,2,3,4]
{1,2,3,4}
[]
发生了什么事?调用函数时,不应该将“b”设置为“set()”吗?在Python中使用Python3.6的Im函数是对象,参数被计算并执行一次。这是一个很好的解释: 在您的示例中,可以通过以下操作“修复”:
def func(a,b=None):
if b is None:
b = set()
res=list()
for i in a:
if i not in b:
res.append(i)
b|={i}
return res
查看默认参数的设置:
默认值仅计算一次。当默认值是可变对象(如列表、字典或大多数类的实例)时,这会有所不同
使用默认参数定义函数时,仅当解释器首次执行定义时(实际def
语句),才会计算默认值。这通常不是问题,除非使用可变的默认值。也就是说,一个可以在适当的地方修改的
在您的情况下,当您第一次调用函数时修改函数中的b
时,它会在下次调用时保留该值。为了避免这种情况,您可以这样做:
def func(a,b=None):
if b is None:
b = set()
res=list()
for i in a:
if i not in b:
res.append(i)
b|={i}
return res
现在
b
将始终具有所需的默认值。在第一个函数调用中,b为空
看这里
在第二个函数调用中,b已经填充了元素
因此,如果我不在b中,则此条件不会运行,并返回空列表
试试这个
def func(a):
res=list()
b=set()
for i in a:
if i not in b:
res.append(i)
b|={i}
return res
print(func([1,1,2,2,3,4]))
print(func([1,1,2,2,3,4]))
输出
[1,2,3,4]
[1,2,3,4]
阅读重要警告herehttps://docs.python.org/3/tutorial/controlflow.html#default-参数值