python學習筆記 區域性和全域性作用域

Deuterium_suika發表於2019-03-20

區域性和全域性作用域

在被呼叫函式內賦值的變元和變數,處於該函式的“區域性作用域”。在所有函式之外賦值的變數,屬於“全域性作用域”

*全域性作用域中的程式碼不能使用任何區域性變數;
*但是,區域性作用域可以訪問全域性變數;
*一個函式的區域性作用域中的程式碼,不能使用其他區域性作用域中的變數。
*在不同的作用域中,你可以用相同的名字命名不同的變數。也就是說,可以有一個名為spam的區域性變數,和一個名為spam的全域性變數。
複製程式碼

不讓所有東西變成全域性變數,當特定函式呼叫中的程式碼修改變數時,該函式與程式其他部分的互動,只能通過它的引數和返回值。這縮小了可能導致缺陷的程式碼作用域。

def spam():
    eggs = 311337
spam()
print(eggs)
Traceback (most recent call last):
  File "C:/Users//.PyCharm2018.3/config/scratches/infiniteloop.py", line 4, in <module>
    print(eggs)
NameError: name 'eggs' is not defined
複製程式碼

eggs輸入spam區域性作用域,執行行從spam返回後,區域性作用域被摧毀,不再有eggs的變數

**區域性作用域不能使用其他區域性作用域內的變數

def spam():
    eggs = 99
    bacon()
    print(eggs)

def bacon():
    ham = 101
    eggs = 0

spam()
複製程式碼

輸出為99

   print(eggs)
eggs = 42
spam()
print(eggs)
複製程式碼

列印出42

如果需要在函式內修改全域性變數,使用global語句 global eggs eggs指全域性變數,eggs被賦值時,賦值發生在全域性作用域的eggs上,沒有建立區域性eggs變數

def spam():
    global eggs
    eggs = 'spam'

eggs = 42
spam()
print(eggs)
複製程式碼

輸出spam

如果變數沒有用在賦值語句中就是全域性變數

def ham():
    print(eggs) #This is the global
eggs = 42
ham()
複製程式碼

輸出為42

在一個函式中,如果試圖在區域性變數賦值之前就使用它,就會報錯

def spam():
    print(eggs) #ERROR!
    eggs = 'spam local'
eggs = 'global'
spam()
Traceback (most recent call last):
  File "C:/Users/.PyCharm2018.3/config/scratches/infiniteloop.py", line 5, in <module>
    spam()
  File "C:/Users/.PyCharm2018.3/config/scratches/infiniteloop.py", line 2, in spam
    print(eggs) #ERROR!
UnboundLocalError: local variable 'eggs' referenced before assignment
複製程式碼

相關文章