Python模块的globals与__init__中的globals
抱歉,有点困惑的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