2016-01-23 26 views
1

我使用的是dictionary作爲替代的if/elif結構,看起來像這樣:Python的訪問錯誤的關鍵

newValue = { 
    'int': param.value + (random.choice((-1, 1)) * 
     random.randint(1, param.maxChange)), 
    'float': param.value + random.uniform(-param.maxChange, 
      param.maxChange), 
    'bool': not param.value 
}[param.dataType] 

但當param.dataType'float',它獲得了'int'值。如果我使用if/elif結構,它按預期工作。

if param.dataType == 'int': 
    newValue = param.value + (random.choice((-1, 1)) * 
     random.randint(1, param.maxChange)) 

elif param.dataType == 'float': 
    newValue = param.value + random.uniform(-param.maxChange, 
     param.maxChange) 

elif param.dataType == 'bool': 
    newValue = not param.value 

字典格式有什麼問題?我正在使用Python 2.7

編輯:這並不是說它訪問了錯誤的鍵。我得到一個屬於'int'代碼塊的異常,所以我認爲它試圖將'int'的值賦給newValue。

+0

你有沒有嘗試把浮選擇之前的int選擇? – wogsland

+3

您能否提供一個顯示問題的工作示例。您顯示的代碼不包括param.dataType的創建/初始化。 – Jonathan

+1

特別是,print repr(param.dataType),type(param.dataType)''的輸出是什麼? – 9000

回答

1

在您的代碼中,詞典首先被實例化並添加了'int','float''bool'條目。作爲添加條目的一部分,評估int,param.value + (random.choice((-1, 1)) * random.randint(1, param.maxChange))以及其他表達式的表達式。如果參數沒有正確的數據類型,這會導致問題。爲了解決這個問題,你可以嘗試以下方法:(未經測試,因爲你沒有提供一個工作示例)

newValue = { 
    'int': lambda param: param.value + (random.choice((-1, 1)) * 
     random.randint(1, param.maxChange)), 
    'float': lambda param: param.value + random.uniform(-param.maxChange, 
      param.maxChange), 
    'bool': lambda param: not param.value 
}[param.dataType](param) 

現在的條目都抱着lambda函數和代碼應該只計算一次調用。

此外,每次運行代碼時都會創建字典。如果代碼的這部分運行多次,創建字典一次然後多次使用它應該更有效率。

+0

這確實是發生了什麼,它正在評估一切,我得到一個錯誤。謝謝! – Larvasapiens