2012-12-31 109 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