Python模块全局参数与init全局参数的比较

2024-10-01 17:29:27 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,有点困惑的Python新手问题。假设我有一个名为animals.py的模块。。。。。。。在

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

这和

^{pr2}$

假设我总是先实例化一只狗?在

我想我的问题是,有什么区别吗?在第二个例子中,启动dog是否会像第一个示例一样创建一个模块级globvar,其行为和作用域相同?在


Tags: 模块实例pyselfdefclasscatprint
2条回答

global不创建新变量,它只是声明该名称应引用全局变量而不是局部变量。通常分配给函数/类/…中的变量。。。参考局部变量。例如,使用如下函数:

def increment(n)
  # this creates a new local m
  m = n+1
  return m

这里创建了一个新的局部变量m,即使已经存在一个全局变量m。这是您通常想要的,因为某些函数调用不应该意外地修改周围范围中的变量。如果确实要修改全局变量而不创建新的局部变量,可以使用global关键字:

^{pr2}$

如果构造函数中的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赋值,那么在创建dog时会创建一个模块全局变量:

class dog:
   def __init__(self):
      global globvar
      globvar = 1
...

执行:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1

不,global语句只在分配给方法或函数内的全局变量时才重要。因此__init__是不相关的,它不会创建全局,因为它没有给它分配任何东西。在

相关问题 更多 >

    热门问题