簡體   English   中英

Python模塊全局變量與__init__全局變量

[英]Python module globals versus __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像第一個例子中那樣創建一個模塊級別的globvar ,它的行為相同並具有相同的范圍?

global不會創建新變量,它只是聲明此名稱應引用全局變量而不是本地變量。 通常,函數/ class / ...中變量的賦值是指局部變量。 例如,使用這樣的函數:

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賦值,那么在創建dog時會創建一個模塊全局變量:

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

執行:

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

不, global語句僅在您分配方法或函數中的全局變量時才有意義。 所以這__init__是無關緊要的-它創建全球性的,因為它沒有任何分配給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM