抱歉,有点困惑的 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
关于Python 模块全局变量与 __init__ 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/933042/