【问题标题】:Accessing global function's variables in a local function在局部函数中访问全局函数的变量
【发布时间】:2015-01-15 02:38:27
【问题描述】:

这是我的测试脚本:

def main(): #global
    n = 1
    z = None

    def addone():  #local
        if not z:
            n = n+1
    addone()
    print n

main()

一旦addone() 函数到达调用行,我就会进入它。 此时我只能看到变量z,而看不到n

现在,如果 n 在赋值之前被引用,z 不应该也是如此吗?

同样,如果我将n=n+1 更改为z='hi',我将无法再看到z! 这与我之前对本地/全局函数的所有信念背道而驰!你知道的越多,你对 Python 的了解就越多。

问题:

  • 为什么我可以看到一个而看不到另一个?

  • 我想将global 添加到我想重新分配的这些变量之前吗?

【问题讨论】:

  • 也许这可能会有所帮助:stackoverflow.com/a/21978980/748858
  • 啊哈,确实有用。谢谢。我原以为我必须在函数之外使用global,但很高兴我可以在函数内部使用它。
  • 等等……也许和我想的一样。 global 不是必须在函数外部定义吗?我收到了NameError: global name 'x' is not defined。在函数之外调用它global 也会使其工作。

标签: python python-2.7 variables scope


【解决方案1】:

最好的解决方案是升级到 Python 3 并在内部函数nonlocal n 中使用。次优,如果你必须坚持使用 Python 2:

def main(): #global
    n = [1]
    z = None

    def addone():  #local
        if not z:
            n[0] += 1
    addone()
    print n[0]

main()

像往常一样,“计算机科学中没有任何问题不能通过额外的间接级别来解决”。通过将n 设为列表(并始终使用和分配n[0]),您在某种意义上准确地引入了挽救生命的“额外间接层级”。

【讨论】:

  • 不幸的是,我受限于 python2...这是一个非常有趣的解决方法,我现在可以使用它,因为我认为我们不想将有问题的变量声明为 global .
  • @tenwest,是的,global 应该尽可能避免使用!
【解决方案2】:

好的,经过一些测试,我意识到这一切都与重新分配变量有关。

例如:

def main(): #global
    n = 1
    z = None

    def addone():  #local
        if not z:
            x = n+1
    addone()
    print n

main()

当我在 addone() 函数中时,现在会同时显示 nz。这是因为我不再尝试重新分配 n,这对我来说是有意义的,以保护全局变量不被操纵,如果有人碰巧在局部函数中使用类似的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多