4

抱歉,有些困惑的 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

4

2 回答 2

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
于 2009-05-31T23:12:13.820 回答
4

不,该global语句仅在您分配给方法或函数中的全局变量时才重要。所以这__init__无关紧要——它不会创建全局,因为它没有分配任何东西给它。

于 2009-05-31T22:53:45.807 回答