在Python 2.7.1中,我试图提供一个消息列表作为第一个参数,并将颜色列表作为第二个参数。我希望第二个参数默认为白色列表,如果没有提供的话。这是我试图这样做的方式:
def multicolor_message(msgs, colors=[libtcod.white for x in len(msgs)]):
#function body
libtcod.white是我正在使用的库的一部分,并且不会导致任何问题。
编译器说没有定义变量msgs
。显然,msgs
变量在此范围内不存在,但我需要创建一个适当长度的列表并将其分配给colors
。最干净的方法是什么?
答案 0 :(得分:6)
我会这样做:
def multicolor_message(msgs, colors=None):
if colors is None:
colors=[libtcod.white for x in len(msgs)]
答案 1 :(得分:4)
这是不可能的python,因为函数的默认参数是在函数定义时执行的,并且在调用函数之前,msgs
变量将不可用。
来自docs:
当函数定义为时,将计算默认参数值 执行。这意味着表达式被评估一次,当时 定义函数,并使用相同的“预先计算”值 每次通话。这对了解何时来说尤为重要 default参数是一个可变对象,例如列表或字典: 如果函数修改了对象(例如通过将项附加到a 列表),默认值实际上已修改。这通常不是 意图是什么。解决这个问题的方法是使用None作为默认值, 并在函数体中明确地测试它,例如:
def whats_on_the_telly(penguin=None):
if penguin is None:
penguin = []
penguin.append("property of the zoo")
return penguin