6

Python 2.7.1 では、最初の引数としてメッセージのリストを、2 番目の引数として色のリストを提供しようとしています。2 番目の引数が指定されていない場合は、デフォルトで白人のリストを指定します。これは私がやろうとした方法です:

def multicolor_message(msgs, colors=[libtcod.white for x in len(msgs)]):
#function body

libtcod.white は私が使用しているライブラリの一部であり、問​​題を引き起こすことはありません。コンパイラは、変数msgsが定義されていないと言います。明らかにmsgs変数はこのスコープには存在しませんが、適切な長さのリストを作成して に割り当てる必要がありますcolors。これを行う最もクリーンな方法は何ですか?

4

2 に答える 2

6

私は次のようにします:

def multicolor_message(msgs, colors=None):
  if colors is None:
    colors=[libtcod.white for x in len(msgs)]
于 2012-12-31T13:06:57.423 に答える
4

関数のデフォルト引数は関数定義時に実行されmsgs、関数が呼び出されるまで変数は使用できないため、これは不可能です。

ドキュメントから:

関数定義が実行されると、デフォルトのパラメータ値が評価されます。これは、関数が定義されるときに式が一度評価され、同じ「事前に計算された」値が各呼び出しに使用されることを意味します。これは、既定のパラメーターがリストや辞書などの変更可能なオブジェクトである場合に特に重要です。関数がオブジェクトを変更する場合 (たとえば、項目をリストに追加することによって)、既定値は事実上変更されます。これは通常、意図したものではありません。これを回避する方法は、デフォルトとして None を使用し、関数の本体で明示的にテストすることです。次に例を示します。

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin
于 2012-12-31T13:07:42.787 に答える