網站首頁 編程語言 正文
修改閉包內使用的外部變量
錯誤示例:
# 定義一個外部函數
def func_out(num1):
# 定義一個內部函數
def func_inner(num2):
# 這里本意想要修改外部num1的值,實際上是在內部函數定義了一個局部變量num1
num1 = 10
# 內部函數使用了外部函數的變量(num1)
result = num1 + num2
print("結果是:", result)
print(num1)
func_inner(1)
print(num1)
# 外部函數返回了內部函數,這里返回的內部函數就是閉包
return func_inner
# 創建閉包實例
f = func_out(1)
# 執行閉包
f(2)
錯誤示例:
# 定義一個外部函數
def func_out(num1):
# 定義一個內部函數
def func_inner(num2):
# 這里本意想要修改外部num1的值,實際上是在內部函數定義了一個局部變量num1
nonlocal num1 # 告訴解釋器,此處使用的是 外部變量a
# 修改外部變量num1
num1 = 10
# 內部函數使用了外部函數的變量(num1)
result = num1 + num2
print("結果是:", result)
print(num1)
func_inner(1)
print(num1)
# 外部函數返回了內部函數,這里返回的內部函數就是閉包
return func_inner
# 創建閉包實例
f = func_out(1)
# 執行閉包
f(2)
小結
修改閉包內使用的外部函數變量使用 nonlocal 關鍵字來完成。
閉包與閉包中修改外部變量
在函數嵌套的前提下,內部函數引用了外部函數的變量,并且外部函數返回(return)了內部函數,即外部函數返回了引用了外部函數變量的內部函數,這時我們稱內部函數為閉包。 比如說如下例子:
# 外部函數
def func_outer(a):
# 內部函數
def func_inner(b):
c = a + b
return c
return func_inner
# 創建閉包實例
f = func_outer(1)
# 執行閉包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)
在這里,f就叫做閉包的實例,func_inner函數就叫做閉包 此時執行結果如下:
可以見得,f里封存了外部函數的變量1,當閉包實例建立出來,再實行閉包實例,此時相當于1+2和1+3,得到了如上結果。 使用debug可以查看到,執行完f = func_outer(1)代碼后,此時一個函數對象已經保存在內存當中:
當一開始步入代碼num1 = f(2)(實行閉包)后:
一個外部函數.內部函數的對象存儲在了內存中,注意:在執行完f = func_outer(1)并沒有立即產生這樣一個對象,而是在調用時才會產生該對象 這時,再步入內部函數:
這樣c=3便出現了,此時在打印c就會出現3,4的出現與3的原理一樣
修改外部函數的變量
代碼如下:
# 外部函數
def func_outer(a):
# 內部函數
def func_inner(b):
nonlocal a
a = 2
c = a + b
return c
return func_inner
# 創建閉包實例
f = func_outer(1)
# 執行閉包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)
多了一行nonlocal a 這里的nonlocal關鍵字是聲明我這里用的是外部的a,而不是自己新定義的局部變量a
原文鏈接:https://cloud.tencent.com/developer/article/1952408
相關推薦
- 2023-07-26 TypeScript的類型推導
- 2022-12-21 View觸發機制API實現GestureDetector?OverScroller詳解_Androi
- 2022-07-19 react組件通訊的基本使用props
- 2023-02-10 Pytorch模型微調fine-tune詳解_python
- 2022-05-04 python機器學習實現oneR算法(以鳶尾data為例)_python
- 2022-07-09 Python如何將數字變成帶逗號的千分位_python
- 2021-12-06 Windows下在CMD下執行Go出現中文亂碼的解決方法_Golang
- 2024-04-02 VsCode中修改/重置git遠程倉庫地址(與拉去遠程項目)
- 最近更新
-
- 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同步修改后的遠程分支