可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
我有以下奇怪的行为: -
def set_diary_time_data(day_str, x={}):
# Dict for template in html
print 'Set diary time data'
print x
我用以下方法调用此函数: -
x = heading_queries.set_diary_time_data(day_str)
因此字典x不作为参数传递,因此应将其初始化为{}
但是,在重复调用此函数时,x中的值将保留在之前的调用中。 这是在django中,当用户登录时调用,前一个用户的详细信息保留在x中。 (x未设置为全局变量。)
我可以通过将功能更改为
来解决这个问题def set_diary_time_data(day_str, x=None):
if not x: x = {}
(Python 2.7)
答案 0 :(得分:0)
在python中,参数和默认值被计算一次,而不是每次调用。这可能会导致一些令人惊讶的行为。
例如:
def foo( names=[ "foo", "bar", "hello" ] )
names.append( "whatever" )
print names
foo()
foo()
生成输出:
[ "foo", "bar", "hello", "whatever" ]
[ "foo", "bar", "hello", "whatever", "whatever"]
因此,经验法则应该是避免任何可变对象作为参数默认值。