Python 模块全局变量与 __init__ 全局变量

标签 python global

抱歉,有点困惑的 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/

相关文章:

python - Pywinauto - 双击的替代品

python - 根据特定列中的负值或 np.nan 值将数据帧拆分为 block

python - for 循环在上一个循环完成之前开始

python - 用OpenCV检测银球和反光球

你能在另一个文件中 extern #define 变量吗?

使用变量时的 PHP 全局访问问题

python - LASSO 中的单热编码分类变量,如何比较变量重要性?

python - 如何简化这个脚本

function - Swift 中如何定义全局函数?

javascript - JavaScript 中的词法作用域