網站首頁 編程語言 正文
1、作用于的概念
變量作用域指的是變量生效的范圍,在Python中一共有兩種作用域。
全局作用域
全局作用域在程序執行時創建,在程序執行結束時銷毀。所有函數以外的區域都是全局作用域。在全局作用域中定義的變量,都屬于全局變量,全局變量可以在程序的任意位置被訪問。
函數作用域
函數作用域在函數調用時創建,在調用結束時銷毀。函數每調用一次就會產生一個新的函數作用域(不調用不產生)。在函數作用域中定義的變量,都是局部變量,它只能在函數內部被訪問。
2、局部變量
所謂局部變量是定義在函數體內部的變量,即只在函數體內部生效。
def testA(): # 局部變量a # 在函數中為變量賦值時,默認都是為局部變量賦值 # 局部變量不會影響函數外的變量。 a = 100 # 函數體內部訪問,能訪問到a變量 print(a) testA() # 100 print(a) # 報錯:name 'a' is not defined
變量a
是定義在testA
函數內部的變量,在函數外部訪問則立即報錯。
局部變量的作用:在函數體內部,臨時保存數據,即當函數調用完成后,則銷毀局部變量。
3、全局變量
所謂全局變量,指的是在函數體內、外都能生效的變量。
思考:如果有一個數據,在函數A
和函數B
中都要使用,該怎么辦?
答:將這個數據存儲在一個全局變量里面。
# 定義全局變量a a = 100 def testA(): print(a) # 訪問全局變量a,并打印變量a存儲的數據 def testB(): print(a) # 訪問全局變量a,并打印變量a存儲的數據 testA() # 100 testB() # 100
思考:testB
函數需求修改變量a
的值為200,如何修改程序?
a = 100 def testA(): print(a) def testB(): a = 200 print(a) testA() # 100 testB() # 200 print(f'全局變量a = {a}') # 全局變量a = 100
思考:在testB
函數內部的a = 200
中的變量a
是在修改全局變量a
嗎?
答:不是。觀察上述代碼發現,15行得到a
的數據是100,仍然是定義全局變量a
時候的值,而沒有返回
testB
函數內部的200。綜上:testB
函數內部的a = 200
是定義了一個局部變量。
(1)global關鍵字
思考:如何在函數體內部修改全局變量?
a = 100 def testA(): print(a) def testB(): # 想要修改全局變量a的值是200 # global 關鍵字聲明a是全局變量 global a a = 200 print(a) testA() # 100 testB() # 200 print(f'全局變量a = {a}') # 全局變量a = 200
global
關鍵字的作用是,在函數內部聲明一個變量為全局變量。換句話說如果希望在函數內部修改全局變量,則需要使用global
關鍵字來聲明變量。
(2)總結
如果在函數里面直接把變量a=200賦值,此時的a
不是全局變量的修改,而是相當于在函數內部聲明了一個新的局部變量。函數體內部修改全局變量: 先global
聲明a
為全局變量,然后再變量重新賦值。
4、變量的查找
當我們使用變量時,會優先在當前作用域中尋找該變量,如果有則使用,
如果沒有則繼續去上一級作用域中尋找,如果有則使用,
如果依然沒有則繼續去上一級作用域中尋找,以此類推。
直到找到全局作用域,依然沒有找到,則會拋出異常 NameError: name 'a' is not defined
。
# 練習說明 a = 10 def fn2(): def fn3(): a = 30 print('fn3中:','a =',a) fn3() print('fn2中:','a =',a) fn2() """ 輸出結果: fn3中: a = 30 fn2中: a = 10 """
5、作用域中可變數據類型變量
c = 10 def fn4(a): # 在函數中對形參進行重新賦值,不會影響其他的變量 a = 20 print('a =', a, id(a)) fn4(c) print('c =', c, id(c)) """ 輸出結果: a = 20 8791349231264 c = 10 8791349230944 """ # 如果形參接收到的數據是一個全局列表 # 當在函數內嘗試修改列表中的元素時,全局列表的數據也會發生改變 c = [1,2,3] def fn4(a): # 如果形參執行的是一個對象,當我們通過形參去修改對象時 # 會影響到所有指向該對象的變量 a[0] = 100 print('a =', a, id(a)) fn4(c) print('c =', c, id(c)) """ 輸出結果: a = [100, 2, 3] 5132808 c = [100, 2, 3] 5132808 """ # 如果我們不向全局變量有所改動 # 就需要使用我們之前學過的淺復制, # 或者傳入一個切片,就可以解決 c = [1, 2, 3] def fn4(a): # 在函數中對形參進行重新賦值,不會影響其他的變量 a[0] = 100 print('a =', a, id(a)) fn4(c.copy()) # fn4(c[:]) print('c =', c, id(c)) """ 輸出結果: a = [100, 2, 3] 6050824 c = [1, 2, 3] 6050312 """
6、多函數程序執行流程
一般在實際開發過程中,一個程序往往由多個函數組成,并且多個函數共享某些數據,如下所示:
(1)共用全局變量
# 1. 定義全局變量 glo_num = 0 def test1(): global glo_num # 修改全局變量 glo_num = 100 def test2(): # 調用test1函數中修改后的全局變量 print(glo_num) # 2. 調用test1函數,執行函數內部代碼:聲明和修改全局變量 test1() # 3. 調用test2函數,執行函數內部代碼:打印 test2() # 100
(2)返回值作為參數傳遞
# 先得到函數一的返回值,再把這個返回值傳入到函數二 def test1(): return 50 def test2(num): print(num) # 1. 保存函數test1的返回值 result = test1() # 2.將函數返回值所在變量作為參數傳遞到test2函數 test2(result) # 50
總結
原文鏈接:https://www.cnblogs.com/liuyuelinfighting/p/15766196.html
相關推薦
- 2022-12-14 PostgreSQL模式匹配與正則表達式方法總結_PostgreSQL
- 2022-05-06 Nginx七層及四層反向代理配置的全過程_nginx
- 2022-06-21 Git基礎之git與SVN版本控制優缺點區別分析_其它綜合
- 2023-01-02 Kotlin中空判斷與問號和感嘆號標識符使用方法_Android
- 2022-12-15 如何使用Python最小二乘法擬合曲線代碼詳解_python
- 2022-10-14 wget -c 斷點續傳命令
- 2022-08-17 C語言堆結構處理TopK問題詳解_C 語言
- 2023-01-17 Android資源文件與層次式導航超詳細講解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支