我认为Python函数中的全局变量必须声明为 global 。那么为什么以下编译运行没有错误?
#!/usr/bin/env python
text = "why is this seen?"
class Foo:
def doit(self):
print(text)
x = Foo()
x.doit()
如果可能的话,我很感激Python3手册的引用。
答案 0 :(得分:2)
您要求参考Python 3手册。我已经粗体化了一段说明你不需要使用global
关键字来引用自由变量。
https://docs.python.org/3/reference/simple_stmts.html?highlight=global#grammar-token-global_stmt
7.12。全球声明
global_stmt :: =“global”标识符(“,”标识符)*
全球声明是一个适用于该声明的声明 整个当前代码块。这意味着列出的标识符是 被解释为全局变量。分配给a是不可能的 没有全局变量的全局变量,虽然自由变量可以参考 没有被声明为全局的全局。
请注意,在大多数代码中,您引用的所有类和函数都是全局(或内置函数),但在调用之前您没有考虑过不需要global print
。
答案 1 :(得分:1)
所有关于scope,因为text
在外面宣布,没有任何类或函数,它可以从任何地方到达。为了获得更好的想法,请考虑以下两个示例:
#!/usr/bin/env python
text = "why is this seen?"
class Foo:
def doit(self):
text = "this is changed"
print(text)
x = Foo()
x.doit()
print text
在上面的示例中,我们在text
类中本地覆盖Foo
变量,但全局文本实例是相同的。但在这种情况下:
#!/usr/bin/env python
text = "why is this seen?"
class Foo:
def doit(self):
global text
text = "this is changed"
print(text)
x = Foo()
x.doit()
print text
我们声明我们需要global
版本的文本,然后我们可以修改它。
但是:global
变量是不受欢迎的,考虑使用函数的输入参数并返回新值,而不是让变量全局可访问
正确的方法:
#!/usr/bin/env python
class Foo:
text = "why is this seen?"
def doit(self):
print(self.text)
x = Foo()
x.doit()
将text
封装在课程中!
答案 2 :(得分:0)
如果您只需要访问它,则无需使用global
指定变量。你可以在没有global
的情况下做到这一点。
在这里, Python将首先在类Foo
范围内查找text
变量。因为,它在text
类中找不到变量Foo
所以它会查看外部范围。现在,它找到变量text
,因此它使用该值来打印输出。
根据Python docs,在执行期间的任何时候,至少有三个嵌套作用域,其名称空间可以直接访问:
- 首先搜索的最里面的范围包含本地名称
- 任何封闭函数的范围,从最近的封闭范围开始搜索,包含非本地,但也 非全球名称
- 倒数第二个范围包含当前模块的全局名称
- 最外层范围(最后搜索)是包含内置名称的命名空间
醇>