0

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我有以下奇怪的行为: -

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)

4

1 回答 1

0

在 python 中,参数和默认值只计算一次,而不是每次调用。这可能会导致一些令人惊讶的行为。

例如:

def foo( names=[ "foo", "bar", "hello" ] )
  names.append( "whatever" )
  print names

foo()
foo()

产生一个输出:

[ "foo", "bar", "hello", "whatever" ]
[ "foo", "bar", "hello", "whatever", "whatever"]

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

于 2013-01-21T02:24:52.833 回答