6

在 Python 2.7.1 中,我试图提供一个消息列表作为第一个参数,并提供一个颜色列表作为第二个参数。如果没有提供,我希望第二个参数默认为白人列表。这是我尝试这样做的方式:

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

这在 python 中是不可能的,因为函数的默认参数是在函数定义时执行的,并且在调用函数之前,您的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 回答