0

重複の可能性:
Python の「最小の驚き」: 変更可能な既定の引数

私は次のような奇妙な振る舞いをしています:-

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 = {}

(パイソン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 に答える