在没有"全局"的实例方法中使用的全局变量

时间:2015-07-24 15:32:10

标签: python

我认为Python函数中的全局变量必须声明为 global 。那么为什么以下编译运行没有错误?

#!/usr/bin/env python
text = "why is this seen?"
class Foo:
    def doit(self):
        print(text)
x = Foo()
x.doit()

如果可能的话,我很感激Python3手册的引用。

3 个答案:

答案 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,在执行期间的任何时候,至少有三个嵌套作用域,其名称空间可以直接访问:

  
      
  1. 首先搜索的最里面的范围包含本地名称
  2.   
  3. 任何封闭函数的范围,从最近的封闭范围开始搜索,包含非本地,但也   非全球名称
  4.   
  5. 倒数第二个范围包含当前模块的全局名称
  6.   
  7. 最外层范围(最后搜索)是包含内置名称的命名空间
  8.