python基礎(九)python中的global關鍵字

  python解釋器查找變量時遵循‘legb’原則即:1.先在local即局部作用域中查找變量聲明和值,如果沒有找到;2則在函數的closure屬性中查找變量(只有閉包函數要考慮)即enclosing,如果還沒有找到;3則在全局作用域(global)中查找變量,如果還是沒有找到;4則在built-in的變量中查找,也就是python的關鍵字和默認的全局函數(e.g. list tuple open print)。
  舉個例子說明一下:

age = 18
def happy_birthday():
    print("age {}, happy birthday ~".format(age))
happy_birthday()
print("your age is {}".format(age))
'''
age 18, happy birthday ~
your age is 18
'''

  分析一下代碼,當調用happy_birthday()函數時,python對其內部變量age的查找過程是:1.在函數內局部查找發現沒有變量age被定義,接下就去找嵌套函數,發現這個函數內沒有嵌套函數,然後到全局範圍去找,發現在函數外部age被定義了所以這個函數用了全局變量age=18的值,變量age已經找到,結束查找過程。然後我們來看下面一段代碼:

age = 18
def happy_birthday():
    print("age {}, happy birthday ~".format(age))
    age += 1 # 修改處
happy_birthday()
print("your age is {}".format(age))
'''
Traceback (most recent call last):
  File "D:\Sublime Text 3\ts.py", line 5, in <module>
    happy_birthday()
  File "D:\Sublime Text 3\ts.py", line 3, in happy_birthday
    print("age {}, happy birthday ~".format(age))
UnboundLocalError: local variable 'age' referenced before assignment
'''

  我在happy_birthday函數後面加了一句age+=1,我試圖去修改age的值,但是python解釋器報錯了。錯誤是age沒被定義。why?age明明是個全局變量被定義了。原因是python中的全局變量不僅僅是可以直接定義在函數外部還可以用global關鍵字在函數內部聲明變量爲全局變量。這兩種方式它們的不同點在於:第一種方式,它的值在函數內部只能被引用不可被更改(這就是報錯的原因,在這點上python不同於其他語言),要想更改只能再函數外更改即以全局的方式修改或者使用第二種方式。第二種方式,你在函數內部以global關鍵字聲明該變量,因爲這個變量在函數內部所以它可以在函數內部被修改,又因爲它被定義爲global,所以它又是全局的,它的最終值可以在函數外被訪問到當然也可以被修改。所以,改一下代碼就是:

age = 18
def happy_birthday():
    global age
    print("age {}, happy birthday ~".format(age))
    age += 1
happy_birthday()
print("your age is {}".format(age))
'''
age 18, happy birthday ~
your age is 19
'''

  總結:當你想保留局部作用域(如函數)中的變量,那麼你應當用global關鍵字對該變量進行聲明,然後再定義這個變量,當退出局部作用域後這個變量仍然存在。當你想把全局變量用到局部區間並不僅僅是訪問的話(例如想修改它),那麼你應當在局部作用域中對該全局變量用global進行聲明,也就是對於全局變量要把它拿到函數中使用時應當用global進行聲明。從這兒也可以發現global關鍵字一般都是用在局部作用域中(例如函數中),而不是用在全局中(函數外部),當然你也可以用不過是多次一舉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章