电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python閉包與引用以及需要注意的陷阱

瀏覽:3日期:2022-07-10 18:44:46

python閉包

關于閉包, 很多blog中都這樣解釋 :對于一個嵌套定義的函數,外層的函數的返回值是內層函數,而在內層函數中又引用了外層函數的局部變量,在外層函數執行后,其局部變量并非被回收,而會同返回的內層函數一同存在,而這一現象被稱為閉包(closure)。

不過以上的理解有些繁瑣和局限, 在計算機科學中 ,閉包(Closure)詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。 這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 也即對于第一段中的定義可以適當放開一些限制條件,python中的閉包實現也并非那么局限。

引用

通過上文介紹可以對于python閉包有大概的了解, 但是有些看似簡單的細節卻需要進一步闡述 。

python中變量的概念,這是與C/C++中極為不同的,在C/C++中變量是一個名稱與內存合一的實體,改變一個變量的值,并不改變其內存的地址。 而變量這個概念在python中并不合用,很多場合它的運用都會讓人混淆 。

python中所使用的概念是引用和對象,即如a=123,a即是一個引用名稱,123是內存中所儲存的對象值。這其實更像是C/C++中的指針與其所指向的內存,可以看作python在此之上對語法進行了包裝。

回到之前討論的閉包話題,在其中用到了 變量 的概念,即函數引用的 變量 將與函數一同存在,這里的 變量 其實是引用名稱與內存對象的復合概念。我們這里對其進行進一步的闡明:

函數中所使用的外層函數引用名稱(指針),在外層函數退出后其所指向的內存對象并不回收,而該引用名稱(指針)會與內層函數一同存在,雖然此時該引用名稱(指針)對于內層函數不是“可見的”。

陷阱

def count(): fs = [] for i in range(1, 4): def f(): return j*j fs.append(f) return fsf1, f2, f3 = count()print(f1())print(f2())print(f3())

對于以上代碼,假如按照C/C++中的概念去理解python中的變量,就會以為其輸出依次為1、2、3。其實不然,真正輸出為:3、3、3。根據上一小節中對于python中引用與閉包的闡述,在內存f函數中使用外層的引用名稱i,在循環中雖然將不同的f函數加入到列表fs中,但是它們都使用的是同一個引用i,而該引用最后對應的值為3。

再看一段代碼,這個會稍微復雜一點

def test(): for i in range(4): yield i g=test()for n in [1,10]: g=(n+i for i in g) print(list(g))

上面這段代碼的輸出,一時不查之下也會以為是11、12、13、14,而其真實結果卻是20、21、22、23,讓人一時抓不到頭腦。首先在for循環中的生成器表達式(n+i for i in g),它其實本質上是一個函數,寫成表達式的形式不過是一種語法糖,其函數形式為:

def gen(n): # g是外面全局的那個生成器g for i in g: yield n+i

即生成器generator本身是一種算法或是函數,只有在“調用”它的時候,也就是對其進行for或是list或是next之類的操作時,才會真正的有值流動。

那么對于以上第二例子中的代碼,在for循環內n=1時,g這個生成器被重新賦值,但注意它此時只是一個特殊的函數,此時的n與i并沒有真正相加,在for循環的第二輪n=10的時候,(n+i for i in g)表達式中對g才進行了調用,那么此時流進函數的n值其實是10,也就是此時g這個生成器對應的值為10、11、12、13,也就是i所引用的是這些值,下面又以相同的n+i的形式創造一個新的生成器對g重新賦值,并退出循環。則自然,此時g中對應的值為20、21、22、23.

以上就是python閉包與引用以及需要注意的陷阱的詳細內容,更多關于python 閉包與引用的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折! | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 壹作文_中小学生优秀满分作文大全 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 北京租车牌|京牌指标租赁|小客车指标出租| 海水晶,海水素,海水晶价格-潍坊滨海经济开发区强隆海水晶厂 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 |