2016-07-24 1 views
-2

Я недавно начал программировать. Все работает нормально, но этот фрагмент кода меня очень заинтриговал с давних времен.Почему функция не меняет глобальную переменную даже после указания глобального

Вот мой код.

addon = 20 
startup = 50 + addon 

def click(): 
    global addon, startup 
    addon *= 2 
    print addon, startup 

click() 
click() 
click() 
click() 
click() 
click() 
click() 
click() 
click() 
click() 

Это мой выход: -

40 70 
80 70 
160 70 
320 70 
640 70 
1280 70 
2560 70 
5120 70 
10240 70 
20480 70 

Это то, что я ожидал: -

40 90 
80 170 
160 330 
320 650 
640 1290 
1280 2570 
2560 5130 
5120 10250 
10240 20490 
20480 40970 

Я просто не получаю. если каждый вызов click обновляет глобальную переменную addon, а также должен обновлять переменную startup. Но не знаю, почему он не работает.

+0

@Sanatan: Как должен 'startup' быть обновлен? Должен ли он также умножаться на '2'? – kamwo

+0

На самом деле это было 'startup = 50 + addon' not' startup = 50'. Пожалуйста помоги. –

+0

Где код, который меняет запуск. Вы устанавливаете его на 70 и никогда не меняете. –

ответ

1

startup не сохраняет выражения, он сохраняет результата выражения, раз.

Другими словами, переменная startup ссылается на результат из 50 + addon, который в то время является целым числом 70.

Это addon более поздние изменения здесь не меняются, потому что startup не ссылается addon.

Вы должны были бы сделать startup в функцию вместо этого, и вызова этой функции каждый раз, если вы хотите, чтобы повторно вычислить выражение:

startup = lambda: 50 + addon 

Я использовал lambda expression создать функцию здесь; a lambda создает функцию из одного выражения.

Вы тогда звоните startup каждый раз, когда вам нужно, чтобы увидеть последний результат:

def click(): 
    global addon 
    addon *= 2 
    print addon, startup() 
+0

thankyou, я потратил много времени на поиск в Интернете, но так и не получил ответа. Большое спасибо. –