【问题标题】:Python global vs local variables?Python全局变量与局部变量?
【发布时间】:2017-04-02 18:02:43
【问题描述】:

我无法理解为什么我的代码会这样工作。现在,我正在初始化一个我设置为 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)

【问题讨论】:

  • "但是,当我以 i 作为参数调用reach_load 时,我不是传入了 i (0) 的全局值吗?" - 是的,但是当你分配给它时,你并没有分配给全局。见nedbatchelder.com/text/names.html

标签: python


【解决方案1】:

i 在这里是一个纯粹的局部变量。它不链接到同名的全局变量;你把它叫做同一个东西这一事实没有任何区别。

【讨论】:

  • 第二次调用reach_load函数时,传入的i不是0吗?
  • 是的,是的,因为你没有修改全局。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    因为reach_loadi 参数是一个形式参数,所以它是函数的本地参数。它是具有相同标签的局部变量。如果您真的想增加全局变量,请将global i 放在函数的顶部。然而,这被认为是糟糕的设计。如果您需要保留某些状态,请使用 class 定义一个新对象以保留它。

    【讨论】:

      【解决方案4】:

      当您在第 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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 2015-08-19
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多