gpt4 book ai didi

python - Python中的默认参数是静态的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 21:01:45 25 4
gpt4 key购买 nike

作为一名 C++ 程序员,我在 Python 中遇到了意想不到的行为。在下面的示例中,输出为:

y:A1
A1
B1

但是我希望得到这样的输出:

B1

我使用的是Python 2.7。对我来说,令人惊讶的是,在函数的第二次调用中,默认参数已经具有前一次调用结果中的值。它不应该是一个空列表吗?

这是Python代码:

def f( x, y=[]):
for z in y:
print "y:" + str(z)
result = y
result.append(x+'1')
return result

l = f('A')
l = f('B')

for x in l:
print x

编辑:正如其他人指出的,这个问题是重复的。简而言之,Python 仅在程序启动时计算默认参数一次,并将结果静态存储在函数中。从 C++ 中,我预计每次调用函数时都会对其进行求值,并且仅存储在本地而不是静态的。

在我的代码中,我看到这种行为有两种危险情况:A) 该函数应该修改一个列表,但如果在函数调用时未传递参数,则该函数应该以空列表开头。现在我遇到的问题是列表越来越多。

解决方案是a)删除参数的默认值,以便我至少被迫提供一个空列表:

def f( x, y):
result = y
result.append(x+'1')
return result

l = f('A',[])
l = f('B',[])

b) 使用 None 作为默认参数:

def f( x, y=None):
result = y or []
result.append(x+'1')
return result

B)另一个问题是默认参数是在程序启动时计算的,我使用了现在的时间戳作为默认参数...

最佳答案

result = y 使名称 resulty 指向内存中的同一个对象,因此列表 y第二次调用中的 code> 不会为空(因为现在对 result 的任何修改也会出现在 y 中(在您的情况下,您要附加到它)),尝试这个(列表切片)它会给你你想要的输出:

result = y[:] # elements of y, from the first to the last

这个切片相当于值中的result = y,但是resulty将指向内存中的两个不同的对象,因为切片创建一个新列表。

关于python - Python中的默认参数是静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com