Python 全局變量和局部變量 [Python Function][Python 全局變量作用域][Python 局部變量作用域]

您的“關注”和“點贊”,是信任,是認可,是支持,是動力…

如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。

1 Python 全局變量

1.1 Python 全局變量概述

在 Python 中,根據變量的定義位置劃分,在所有函數的外部定義的變量,稱爲全局變量,英文叫做 Global Variable。

1.2 定義全局變量的方式

1.2.1 在函數外定義全局變量

在所有函數外定義的變量,鐵定是全局變量。

舉例如下所示:

name = '碼農阿杰'  # 函數外定義全局變量


def info():  # 定義 info() 函數
    print('在函數內訪問全局變量 name =', name)


info()  # 調用 info() 函數
print('在函數外訪問全局變量 name =', name)

運行結果:

在函數內訪問全局變量 name = 碼農阿杰
在函數外訪問全局變量 name = 碼農阿杰

1.2.2 在函數內定義全局變量

在函數內定義的變量,如果使用 global 關鍵字對其修飾,那麼該變量就是全局變量。

舉例如下所示:

def info():  # 定義 info() 函數
    global name  # 注意:先使用 global 關鍵字對函數內的變量進行修飾,此時不能給變量賦值,否則語法會不通過的哦。
    name = '阿杰老師'  # 注意:再對變量進行賦值。那麼 name 變量就變成了全局變量。
    print('在函數內訪問全局變量 name =', name)


info()  # 調用 info() 函數
print('在函數外訪問全局變量 name =', name)

運行結果:

在函數內訪問全局變量 name = 阿杰老師
在函數外訪問全局變量 name = 阿杰老師

1.3 Python 全局變量作用域概述

Python 全局變量的默認作用域是整個程序。

具體指的是全局變量可以在各個函數的外部使用,也可以在各個函數的內部使用。從上面的例子中可以看出,全局變量 name ,既可以在函數內被訪問,也可以在函數外被訪問。

2 Python 局部變量

2.1 Python 局部變量概述

在 Python 中,根據變量的定義位置劃分,在函數內部定義的變量,稱爲局部變量,英文叫做 Local Variable。

舉例如下所示:

例一,

def info():  # 定義 info() 函數
    name = '阿杰老師'  # 在函數內定義的局部變量 name
    print('在函數內訪問全局變量 name =', name)


info()  # 調用 info() 函數
print('在函數外訪問全局變量 name =', name)  # 在函數外訪問局部變量,會報錯

運行結果:

在函數內訪問全局變量 name = 阿杰老師
    print('在函數外訪問全局變量 name =', name)
NameError: name 'name' is not defined

例二,

def info(age):  # 定義 info(age) 函數
    name = '阿杰老師'  # 在函數內定義的局部變量 name
    print('在函數內訪問全局變量 name =', name)
    print('在函數內訪問形參 age =', age)


info(18)  # 調用 info() 函數
print('在函數外訪問全局變量 name =', name)  # 在函數外無法訪問局部變量
print('在函數外訪問形參 name =', age)  # 形參也是局部變量,在函數外無法訪問

運行結果:

在函數內訪問全局變量 name = 阿杰老師
在函數內訪問形參 age = 18
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 11, in <module>
    print('在函數外訪問全局變量 name =', name)  # 在函數外無法訪問局部變量
NameError: name 'name' is not defined

2.2 Python 局部變量作用域概述

Python 局部變量的作用域僅限於函數內部,出了函數就不能使用了,

具體指的是局部變量在函數外部被訪問,Python 解釋器會報 NameError 錯誤,並提示我們沒有定義要訪問的變量。從上面的例子以及運行結果可以看出。

3 獲取指定作用域範圍內的變量

3.1 使用 globals() 函數獲取全局作用域內的所有全局變量

使用格式如下所示:

globals()

對以上格式說明,

  • globals():是 Python 的內置函數。
  • 返回值:globals() 函數返回一個包含全局作用域內的所有全局變量(包含 Python 內置的全局變量)的字典,鍵爲變量名,值爲變量值。

舉例如下所示:

# 定義全局變量
name = '碼農阿杰'
age = 18


def info():
    # 定義局部變量
    gender = '男'
    num = 1012


print(globals())
globals()['name'] = '阿杰'  # 訪問全局變量 name,並修改
print('修改後的 name =', name)


運行結果:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000017FE0CE0880>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py', '__cached__': None, 'name': '碼農阿杰', 'age': 18, 'info': <function info at 0x0000017FE2935EE0>}
修改後的 name = 阿杰

3.2 使用 locals() 函數獲取當前作用域內所有變量

使用格式如下所示:

locals()

對以上格式說明,

  • locals():是 Python 的內置函數。
  • 返回值:返回包含當前作用域(在函數內用 locals() 函數,返回包含所有局部變量的字典;在函數外用 locals() 函數,與 globals() 函數作用相同)內所有變量(包含 Python 內置的全局變量)的字典。

舉例如下所示:

# 定義全局變量
name = '碼農阿杰'
age = 18


def info():
    # 定義局部變量
    gender = '男'
    num = 1012
    print(locals())  # 在函數內使用 locals() 函數
    locals()[gender] = '女'  # 只能訪問,不能修改
    print('修改後 gender =', gender)


info()  # 調用 info() 函數
print('------------------------------')
print(locals())  # 在函數外使用 locals() 函數

運行結果:

{'gender': '男', 'num': 1012}
修改後 gender =------------------------------
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000012533DF0880>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py', '__cached__': None, 'name': '碼農阿杰', 'age': 18, 'info': <function info at 0x0000012535A35EE0>}

3.3 使用 vars(object) 函數獲取指定範圍內所有的變量

使用格式如下所示:

vars([object])

對以上格式說明,

  • vars():是 Python 的內置函數。
  • 返回值:返回一個指定 object 對象範圍內所有變量(包含 Python 內置的全局變量)組成的字典。
  • [object]:可選參數。不寫 object 參數,vars() 和 locals() 的作用完全相同。

舉例如下所示:

# 定義一個 Person 類
class Person:
    # 定義全局變量
    name = '碼農阿杰'
    age = 18


print(vars())  # 不寫 object 參數,跟 locals() 函數用法一樣。
print('----------------------------')
print(vars(Person))  # 寫 object 參數

運行結果:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001C00F7E0880>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py', '__cached__': None, 'Person': <class '__main__.Person'>}
----------------------------
{'__module__': '__main__', 'name': '碼農阿杰', 'age': 18, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

【友情鏈接】

微信公衆號:碼農阿杰

博客園

【參考資料】

Python 官網

Python 3.8.2 documentation

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