在函数参数中列出理解

时间:2012-12-31 13:04:49

标签: python list list-comprehension keyword-argument

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

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

libtcod.white是我正在使用的库的一部分,并且不会导致任何问题。 编译器说没有定义变量msgs。显然,msgs变量在此范围内不存在,但我需要创建一个适当长度的列表并将其分配给colors。最干净的方法是什么?

2 个答案:

答案 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