Python模块的globals与__init__中的globals

4 投票
2 回答
3934 浏览
提问于 2025-04-15 11:57

抱歉,有点困惑的Python新手问题。假设我有一个叫做 animals.py 的模块……

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

这和下面的有什么区别呢

class dog:
   def __init__(self):
      global globvar

   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

假设我总是先创建一个狗对象?

我想问的是,这两者之间有什么不同吗?在第二个例子中,创建 dog 对象是否会像第一个例子那样,生成一个模块级别的 globvar,并且它的行为和作用范围是一样的吗?

2 个回答

4

不,global 这个声明只有在你在一个方法或函数里给全局变量“赋值”时才重要。所以 __init__ 是没关系的——它并不会创建全局变量,因为它没有给全局变量赋值。

9

global 这个词并不是用来创建一个新变量的,它只是告诉程序,这个名字应该指向一个全局变量,而不是局部变量。通常在函数、类等里面给变量赋值时,都是指局部变量。比如说,有这样一个函数:

def increment(n)
  # this creates a new local m
  m = n+1
  return m

在这里,即使已经有一个全局变量 m 存在,函数里还是会创建一个新的局部变量 m。这通常是我们想要的,因为有些函数调用不应该意外地修改外部的变量。如果你确实想要修改一个全局变量,而不是创建一个新的局部变量,你可以使用 global 这个关键词:

def increment(n)
  global increment_calls
  increment_calls += 1
  return n+1

在你的例子中,构造函数里的 global 并没有创建任何变量,后续尝试访问 globvar 也会失败:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "animals.py", line 7, in bark
    print globvar
NameError: global name 'globvar' is not defined

但是,如果你在构造函数里给 globvar 赋值,那么在你创建一个狗的时候,就会创建一个模块级的全局变量:

class dog:
   def __init__(self):
      global globvar
      globvar = 1
...

执行结果:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1

撰写回答