Python模块全局变量与__init__全局变量

时间:2009-05-31 22:44:10

标签: python global

道歉,有点困惑的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 个答案:

答案 0 :(得分:8)

global不会创建新变量,它只是声明此名称应引用全局变量而不是本地变量。通常,函数/ class / ...中变量的赋值是指局部变量。例如,采用这样的函数:

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

答案 1 :(得分:4)

不,只有在分配给方法或函数中的全局变量时,global语句才有意义。因此__init__无关紧要 - 创建全局,因为它没有为其分配任何内容。