无法在参数列表中初始化字典?

时间:2013-01-21 01:57:56

标签: python django

  

可能重复:
  “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)

1 个答案:

答案 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"]

因此,经验法则应该是避免任何可变对象作为参数默认值。