python - 如果我要使用一个变量,我必须总是在我的函数中将它引用为全局变量吗?

标签 python function pointers

首先,它与这个功能有关:

a = 3
def b():
    a = a+1
    return a 

返回错误。

不就是b的本地环境找不到'a',然后去b所在的父环境> 被定义了,也就是发现'a'3

为什么我必须用 global a 引用它才能让它工作?意思是,只有当直接父环境是全局环境时我才必须这样做吗?因为下面的函数似乎可以引用父环境:

def b():
    def c():
        print c
    return c()

最佳答案

这是一个很常见的问题,实际上在 Python FAQ 中。 :

[...] when you make an assignment to a variable in a scope, that variable becomes local to that scope and shadows any similarly named variable in the outer scope. Since the last statement in foo assigns a new value to x, the compiler recognizes it as a local variable.

因此,Python 看到您正在使用 a = .. 分配给一个局部变量,然后认为,嘿,一个局部变量,我对此没有意见。但是,当它实际遇到 该赋值的内容 (a + 1) 并看到相同的名称 a 时,它会提示,因为 您试图在分配它之前引用它

这就是以下不会引发错误的原因:

def b():
    a = 20
    a = a + 2
    return a

您首先进行赋值,a 被视为函数 b 的局部,当遇到 a = a + 2 时,Python知道 a 是一个局部变量,这里没有混淆。


在另一种情况下,您添加了:

def b():
    def c():
        print c
    return c()

您只是引用一个包含在函数b 范围内的名称,引用。如果您将此更改为与以前类似的分配,您将得到相同的 UnboundLocalError:

def b():
    def c():
        c = c + 20
    return c()

关于python - 如果我要使用一个变量,我必须总是在我的函数中将它引用为全局变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34824453/

相关文章:

python - 通过 python opencv 查找齿轮的 dentry

javascript - 如何使用对象解构处理嵌套的默认参数?

c++ - 使用父类函数作为回调订阅主题

java - 等待监听器完成任务并获取另一个函数的结果 [Android]

c++ - 如何在 C++ 中转换指针

python - 使用tensorflow.keras连接两个模型

python - django:单元测试来自响应和 session 的 html 标签

c - 使用指向指针的指针有什么意义?

即使 curl 和浏览器给出连贯的文本,Python 请求库也会给出乱码响应

c - "pointer->register_next->value"和 C 中的 "pointer->register_next.value"一样吗?