道歉,有点困惑的Python新手问题.假设我有一个名为animals.py....... 的模块.
globvar = 1
class dog:
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
Run Code Online (Sandbox Code Playgroud)
这和之间有什么区别?
class dog:
def __init__(self):
global globvar
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
Run Code Online (Sandbox Code Playgroud)
假设我总是首先实例化一只狗?
我想我的问题是,有什么区别吗?在第二个示例中,是否像第一个示例中一样启动dog创建模块级别globvar,它的行为相同且范围相同?
global不会创建新变量,它只是声明此名称应引用全局变量而不是本地变量.通常,函数/ class/...中变量的赋值是指局部变量.例如,使用这样的函数:
def increment(n)
# this creates a new local m
m = n+1
return m
Run Code Online (Sandbox Code Playgroud)
这里m创建了一个新的局部变量,即使可能存在全局变量m.这是您通常想要的,因为某些函数调用不应意外地修改周围范围中的变量.如果您确实想要修改全局变量而不是创建新的本地变量,可以使用以下global关键字:
def increment(n)
global increment_calls
increment_calls += 1
return n+1
Run Code Online (Sandbox Code Playgroud)
在您的情况下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
Run Code Online (Sandbox Code Playgroud)
但是如果你实际上globvar在构造函数中赋值,则在创建dog时会创建一个module-global变量:
class dog:
def __init__(self):
global globvar
globvar = 1
...
Run Code Online (Sandbox Code Playgroud)
执行:
>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3119 次 |
| 最近记录: |