2012-12-31 128 views
6

在Python 2.7.1中,我试图提供一个消息列表作为第一个参数,并将颜色列表作为第二个参数。我希望第二个参数默认为白名单,如果没有提供。这是我试图做到这一点:函数参数中的列表理解

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

libtcod.white是我使用并且不以任何方式造成任何问题库的一部分。 编译器说变量msgs未定义。很明显,msgs变量在此范围内不存在,但我需要创建一个适当长度的列表并将其分配给colors。什么是最干净的方式来做到这一点?

+0

你应该提供堆栈跟踪/错误信息 –

+1

体内初始化未定义的值的函数,或者通过一个包装器函数来调用它,它为你做这件事。 – tripleee

+0

@InbarRose在这种情况下,堆栈跟踪并不是必需的,以查看错误 – piokuc

回答

6

我会做这样的:

def multicolor_message(msgs, colors=None): 
    if colors is None: 
    colors=[libtcod.white for x in len(msgs)] 
+4

而这样做的原因是您不能在默认值中引用同一函数的其他参数。默认值是在函数的定义范围中进行求值的,并且参数本身只在函数被调用时才存在。 –

+0

@MattiVirkkunen没错。 – piokuc

+2

另一个重要的原因是[可变默认参数](http://stackoverflow.com/q/1132941/395760)很少做你想要的。 – delnan

4

这是不可能的是蟒蛇,作为函数的默认参数在函数定义时间执行,直至函数被调用你的msgs变量将不可用。

docs:当函数定义执行

默认参数值进行了评价。这意味着该表达式在定义函数 时被评估一次,并且每次调用使用相同的“预先计算”值 。这对于了解何时 默认参数是可变对象(如列表或字典)尤为重要:如果函数修改对象(例如,通过将项目附加到 列表),默认值实际上被修改。这通常不是 意图。解决的办法是使用无作为默认, 并且在函数体明确地测试它,比如:

def whats_on_the_telly(penguin=None): 
    if penguin is None: 
     penguin = [] 
    penguin.append("property of the zoo") 
    return penguin 
+0

不在编译时。在函数定义时。这些差异对于嵌套函数或在表达式中使用模块级名称时很重要。 – delnan