为什么即使在指定全局之后,函数也不会改变全局变量

问题描述:

我最近开始编程。一切工作正常,但这段代码很长一段时间让我着迷。为什么即使在指定全局之后,函数也不会改变全局变量

这是我的代码。

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'而不是'startup = 50'。请帮忙。 –

+0

更改启动的代码在哪里?您将其设置为70并且永不改变它。 –

startup不存储一个表达,它存储结果的表达式的一次

换言之,可变startup引用结果的50 + addon,这在当时是整数70

addonaddon以后的变化在这里没有什么区别,因为startup没有引用addon

你不得不做出startup一个功能相反,每一次调用这个函数,如果你想重新计算表达式:

startup = lambda: 50 + addon 

我用lambda expression在这里创建的功能; lambda从单个表达式创建一个函数。

你然后调用startup每次需要看到最新的结果时间:

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

谢谢,我花了很多时间在互联网上搜索但从来没有得到答案。非常感谢。 –