2013-07-23 22 views
0

我有以下Python字典:爲Python字典提供默認值,同時保持引用原始對象

box = { 
    'name': 'Test', 
    'length': 10, 
    'width': 20 
} 

我需要傳遞時,它變成修改它的功能,參考保持這個對象。 功能將提供(在這個例子中height)缺少的默認信息:

def update_box(params): 
    defaults = { 
     'name': 'Default', 
     'length': 5, 
     'width': 5, 
     'height': 5 
    } 

    defaults.update(params) 
    params = defaults 

    return params 

現在我需要從函數外部訪問的box性能。例如:

box = { 
    'name': 'Test', 
    'length': 10, 
    'width': 20 
} 

update_box(box) 

print box['name'] # should output 'Test' 
print box['height'] # should output 5 

當然,這並不工作,因爲params = default線在update_box 功能重新分配到paramsdefaults,對於其存在的update_box之外沒有參考。 如果我刪除該行,則box未被修改。

我想要做的是有某種字典update()方法的反轉, 允許我用默認值「填充空白」,同時仍保留對原始對象的引用。 這樣做的最好方法是什麼?

另外,這個例子被簡化了,所以我不能只使用update_box的返回值。謝謝你的幫助!

+0

爲什麼不使用'params.update(默認值)'? – zhangyangyu

+0

因爲這會覆蓋'params'中的值。打印'box ['name']'會導致「Default」而不是「Test」 – Divey

+0

注意:在Python中,字典中未加引號的鍵是變量,而不是字符串。 '{name:'Test'}'將嘗試查找'name'變量並將其值用作關鍵字。 – user2357112

回答

1

您可以在兩個方向上只更新:

defaults.update(params) 
params.update(defaults) 

第一次更新,確保最初在PARAMS的值被保留,而第二個修改PARAMS直接。

或者,只是手工更新:

for k in defaults: 
    params.setdefault(k, defaults[k]) 

然而,一個更好的選擇可能是簡單地返回一個新的字典,而不是直接修改原始一個。

+0

簡單。謝謝@Luke。 – Divey

+0

爲什麼不'setdefault'? – user2357112

+0

當然,'setdefault'更簡單。 – Luke