道歉,有些困惑的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就像在第一个例子中,将行为相同,并且具有相同的范围?

有帮助吗?

解决方案

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

其他提示

没有,则global语句只重要的,当你的分配的一种方法或功能中的一个全局变量。所以这__init__是无关紧要的 - 它的不可以创建全球性的,因为它没有任何分配给它

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top