Python全局vs局部变量?

时间:2017-04-02 18:02:44

标签: python

我无法理解为什么我的代码按照它的方式工作。现在,我正在初始化一个设置为0的全局变量,所以如果我在函数之外的任何地方打印它,我应该得到0。

当我在函数内部打印i时,在调用函数两次后得到6和12。我认为这是因为全局i为0,但是某些本地i变量不是。但是,当我用i作为参数调用reach_load时,我不是传递i(0)的全局值吗?

import sys

d = {}
size_0 = sys.getsizeof(d)
i = 0

def reach_load(d, size_0, i):
    size_0 = sys.getsizeof(d)
    while size_0 == sys.getsizeof(d):
        d[i] = i
        i += 1
    print(i)

reach_load(d, size_0, i)
reach_load(d, size_0, i)

4 个答案:

答案 0 :(得分:1)

i在这里是一个纯粹的局部变量。它没有链接到同名的全局变量;事实上你称之为同样的事情没有任何区别。

答案 1 :(得分:0)

我认为你在这里混淆了两件事:全局i不会改变,但d会改变(因为它是可变的)。 i每次调用reach_load时都会以0开始,但由于字典较大,因此while循环运行时间会更长,因此会打印更多的数字。

答案 2 :(得分:0)

因为i reach_load参数是一个形式参数,所以它是函数的本地参数。它是具有相同标签的局部变量。如果你真的想要增加全局值,那么将global i放在函数的顶部。但是,这被认为是糟糕的设计。如果你需要保持一些状态,用class定义一个新对象来保存它。

答案 3 :(得分:0)

当您在第10行的函数中调用i时,在d[i]中,您正在使用的Python解释器首先检查本地范围内的该变量。如果找不到,则检查下一个范围,在您的情况下恰好是全局范围。此时,您正在调用全局变量。

但是,只要执行i += 1i就会成为局部变量,因为它现在已在本地范围内定义。

但是,我并不是100%对你期望发生的事情。您是否想知道为什么第二次运行该函数会返回不同的结果? 如果是这样,我相信您的问题在于您的size_0变量

你全局定义size_0,但是在你的函数的最开始,在本地重新定义它,这是你的函数最终使用的定义,而全局size_0最终没有被使用。如果您要删除:

size_0 = sys.getsizeof(d)
从你的函数

,每次运行都会产生相同的结果。

确定这些问题真正有用的是添加各种代码来帮助跟踪代码的执行情况。在此示例中,您可以在关键点添加一堆print()语句,例如print(d, size_0) # inside and outside the function

很难再给出建议,因为我不清楚代码应该完成什么。