2014-03-12 16 views
0

我有一個字典(在下面的代碼中喚醒),其中的值是列表。在python中使用def來變換字典

我想改變使用高清每個列表的第二個元素,就像下面:

def auto(t): 
    wakeup('zone1')[1] = wakeup('zone1')[0] - t 

wakeup = {'zone1': [15, auto(1)], 
      'zone2': [15, auto(1)]} 

print wakeup 

它不會起作用,因爲汽車()使引用已定義喚醒之前喚醒。

但是,如果我試圖通過使用def AFTER喚醒定義來解決這個問題,那麼我仍然會收到一個錯誤,因爲此時喚醒字典會在auto()定義之前對auto()進行引用。

理想我想保持這種語法的列表:15,自動(1)]

你能幫幫我嗎?

回答

2

要調用函數auto變量wakeup的聲明,並且您嘗試使用可變wakeup內部功能auto

所以你基本上試圖在實例化之前使用變量wakeup

首先,你需要決定你想要的初始值的變量wakeup

wakeup = {'zone1': [15, zone1_def_val], 
      'zone2': [15, zone2_def_val]} 

然後,在需要時可以調用函數auto

def auto(t): 
    wakeup['zone1'][1] = wakeup['zone1'][0] - t 

auto(2) 
auto(3) 
auto(5) 
... 
print wakeup 

請注意,您需要使用[]而不是()訪問字典中的元素時:

wakeup['zone1'] # good 
wakeup('zone1') # bad 
+0

我有一個小小的反對意見,那就是他實際上並沒有改變全局變量,而是該變量所指向的字典實例(這是一個參考):他不重新分配它。它將工作在沒有全球化我仍然認爲應該在處理全局變量時總是使用它。 –

+0

@Samy Arous:嗯,你確定?在我看來,函數'auto'在這裏改變一個全局變量......我會試試看... –

+0

是的我是,至少在python 2.7中。我還沒有習慣python 3.如果他要爲wakeup分配一個新值:wakupe = {'zone1':[5,0]}那麼全局將是必要的。 –

1

auto的確和字典無關,你應該這樣定義它。

def auto(n, t): 
    return n - t 

wakeup = {'zone1': [15, auto(15, 1)], 'zone2': [15, auto(15, 1)]} 

但是,如果您的實際代碼與此類似,那麼您根本不需要函數。

+0

非常感謝!畢竟這是簡單的:) – andgeo

1

您的代碼根本無效。

修改函數內的字典,最好的辦法是把它作爲參數傳遞

def auto(d, t): 
    for l in d.values(): 
     l[1] = l[0] - t 

wakeup = {'zone1': [15, 0], 
      'zone2': [15, 0]} 

auto(wakeup, 1) 

如果你仍然要修改的字典,但不希望將其作爲參數傳遞,使用全球語法

def auto(t): 
    global wakeup 
    for l in wakeup.values(): 
     l[1] = l[0] - t 

wakeup = {'zone1': [15, 0], 
      'zone2': [15, 0]} 

auto(1) 

在這種特殊情況下,既然你不重新分配喚醒,你並不真的需要全球化,但最好還是永遠使用它,因爲它也最好避免儘可能多地利用全球變量。

此代碼是有效的:

def auto(t): 

    for l in wakeup.values(): 
     l[1] = l[0] - t 

wakeup = {'zone1': [15, 0], 
      'zone2': [15, 0]} 

auto(1)