[英]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.