2017-04-02 145 views
0

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

当我在函数内打印i时, 12次调用该函数两次后。我认为这是因为全球我是0,但一些本地我变量不是。但是,当我用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) 
+1

“然而,当我打电话跟我reach_load作为参数,又不是我传递我的全局值(0)?” - 是的,但是当你分配给它时,你并没有分配给全局。请参阅https://nedbatchelder.com/text/names.html – user2357112

回答

1

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

+0

当我第二次调用reach_load函数时,我传入的不是0吗? – gridproquo

+0

是的,因为你没有修改全局。 –

0

我想你已经在这里混淆了两件事:全球i不会改变,但d确实(因为它是可变的)。每次拨打reach_load时,i开始为0,但由于字典较大,while循环将运行更长,因此将打印更高的数字。

0

因为i参数reach_load是一个正式的参数是本地的功能。这是一个具有相同标签的局部变量。如果你真的想增加全球的话,那么把global i放在这个函数的顶部。但是,这被认为是糟糕的设计。如果您需要保留一些状态,请使用class定义一个新对象以保留它。

0

当您在第10行d[i]处的函数中调用i时,首先使用的Python解释器检查本地作用域中的该变量。如果它没有找到它,它会检查下一个作用域,在你的情况下恰好是全局作用域。此时,您正在调用全局变量。

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

我不是100%,你希望发生什么,虽然。你想知道为什么函数的第二次运行返回不同的结果吗? 如果是这样,我相信你的问题在于你size_0变量

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

从你的函数,每次运行会产生相同的结果。

真正有助于弄清楚这些问题是添加各种代码,帮助你跟踪你的代码的执行。在本例中,您可以在临界点添加一堆print()语句,如print(d, size_0) # inside and outside the function

这是很难给出了建议,因为它不是很清楚,我什么代码应该完成的任务。