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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

深入了解Python 變量作用域

瀏覽:3日期:2022-07-16 13:34:17

特點(diǎn)

python的作用域是靜態(tài)的,在源代碼中變量名被賦值的位置決定了該變量能被訪問的范圍。即Python變量的作用域由變量所在源代碼中的位置決定。Python中并不是所有的語(yǔ)句塊中都會(huì)產(chǎn)生作用域。只有當(dāng)變量在Module(模塊)、Class(類)、def(函數(shù))中定義的時(shí)候,才會(huì)有作用域的概念。

1. 函數(shù)內(nèi)部的變量,函數(shù)外部不能訪問

def func(): variable = 100 print(variable) print(variable) # name ’variable’ is not defined

2. 函數(shù)上層的變量(標(biāo)量)只能讀取,不能再次定義,初始化

def counter1(): n = 0 def compute(): n = n + 1 # n為標(biāo)量(數(shù)值,字符串,浮點(diǎn)數(shù)),Python程序會(huì)因?yàn)椤叭绻麅?nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對(duì)這個(gè)變量有修改.那么python會(huì)認(rèn)為它是一個(gè)局部變量,又因?yàn)楹瘮?shù)中沒有n的定義和賦值,所以報(bào)錯(cuò) # y = n + 1 # 更改為y就沒事 # return y return n return compute

variable = 300def test_scopt(): print(variable) # 此時(shí)調(diào)用局部變量variable并有沒綁定到一個(gè)內(nèi)存對(duì)象(沒有定義和初始化,即沒有賦值)。本質(zhì)上還是遵循的LEGB法則 variable = 200 #因?yàn)檫@里,前面調(diào)用過(guò)一次,所以variable就變?yōu)榱司植孔兞? # print(variable) # 寫在下面就沒問題,因?yàn)関ariable是新的局部變量,而不是重新被定義,卻沒有綁定test_scopt()

Python中的模塊代碼在執(zhí)行之前,并不會(huì)經(jīng)過(guò)預(yù)編譯,但是模塊內(nèi)的函數(shù)體代碼在運(yùn)行前會(huì)經(jīng)過(guò)預(yù)編譯,因此不管變量名的綁定發(fā)生在作用域的那個(gè)位置,都能被編譯器知道。Python雖然是一個(gè)靜態(tài)作用域語(yǔ)言,但變量名查找是動(dòng)態(tài)發(fā)生的,直到在程序運(yùn)行時(shí),才會(huì)發(fā)現(xiàn)作用域方面的問題,

3. list,dict等復(fù)合變量里面的值都可以引用更改

def counter(): n = [0] def compute(): n[0] += 1 # 更改的是n里面的第一個(gè)值,不是更改n return n[0] return computefunc = counter()func() # 1func() # 2func() # 3

4. global 聲明全局變量,如果在局部要對(duì)全局變量修改,需要在局部也要先聲明該全局變量

def counter1(): n = 0 def compute(): global n # 如果在局部要對(duì)全局變量修改,需要在局部也要先聲明該全局變量,但此處也會(huì)報(bào)錯(cuò),因?yàn)闆]有全局變量n n += 1 return n return compute# rightdef counter1(): global n n = 0 def compute(): global n n += 1 return n return compute

5. nonlocal關(guān)鍵字用來(lái)在函數(shù)或其他作用域中使用外層(非全局)變量

def make_counter(): count = 0 def counter(): nonlocal count # 使用外層非全局變量 count += 1 return count return counter

作用域的類型

在Python中,使用一個(gè)變量時(shí)并不嚴(yán)格要求需要預(yù)先聲明它,但是在真正使用它之前,它必須被綁定到某個(gè)內(nèi)存對(duì)象(被定義、賦值);這種變量名的綁定將在當(dāng)前作用域中引入新的變量,同時(shí)屏蔽外層作用域中的同名變量。

L(local)局部作用域

局部變量:包含在def關(guān)鍵字定義的語(yǔ)句塊中,即在函數(shù)中定義的變量。每當(dāng)函數(shù)被調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)新的局部作用域。Python中也有遞歸,即自己調(diào)用自己,每次調(diào)用都會(huì)創(chuàng)建一個(gè)新的局部命名空間。在函數(shù)內(nèi)部的變量聲明,除非特別的聲明為全局變量,否則均默認(rèn)為局部變量。有些情況需要在函數(shù)內(nèi)部定義全局變量,這時(shí)可以使用global關(guān)鍵字來(lái)聲明變量的作用域?yàn)槿帧>植孔兞坑蚓拖褚粋€(gè) 棧,僅僅是暫時(shí)的存在,依賴創(chuàng)建該局部作用域的函數(shù)是否處于活動(dòng)的狀態(tài)。所以,一般建議盡量少定義全局變量,因?yàn)槿肿兞吭谀K文件運(yùn)行的過(guò)程中會(huì)一直存在,占用內(nèi)存空間。注意:如果需要在函數(shù)內(nèi)部對(duì)全局變量賦值,需要在函數(shù)內(nèi)部通過(guò)global語(yǔ)句聲明該變量為全局變量。

E(enclosing)嵌套作用域

E也包含在def關(guān)鍵字中,E和L是相對(duì)的,E相對(duì)于更上層的函數(shù)而言也是L。與L的區(qū)別在于,對(duì)一個(gè)函數(shù)而言,L是定義在此函數(shù)內(nèi)部的局部作用域,而E是定義在此函數(shù)的上一層父級(jí)函數(shù)的局部作用域。主要是為了實(shí)現(xiàn)Python的閉包,而增加的實(shí)現(xiàn)。

G(global)全局作用域

即在模塊層次中定義的變量,每一個(gè)模塊都是一個(gè)全局作用域。也就是說(shuō),在模塊文件頂層聲明的變量具有全局作用域,從外部開來(lái),模塊的全局變量就是一個(gè)模塊對(duì)象的屬性。注意:全局作用域的作用范圍僅限于單個(gè)模塊文件內(nèi)

B(built-in)內(nèi)置作用域

系統(tǒng)內(nèi)固定模塊里定義的變量,如預(yù)定義在builtin 模塊內(nèi)的變量。

作用域鏈:變量名解析LEGB法則

搜索變量名的優(yōu)先級(jí):局部作用域 > 嵌套作用域 > 全局作用域 > 內(nèi)置作用域LEGB法則: 當(dāng)在函數(shù)中使用未確定的變量名時(shí),Python會(huì)按照優(yōu)先級(jí)依次搜索4個(gè)作用域,以此來(lái)確定該變量名的意義。首先搜索局部作用域(L),之后是上一層嵌套結(jié)構(gòu)中def或lambda函數(shù)的嵌套作用域(E),之后是全局作用域(G),最后是內(nèi)置作用域(B)。按這個(gè)查找原則,在第一處找到的地方停止。如果沒有找到,則會(huì)出發(fā)NameError錯(cuò)誤。

example 1

name = 'lzl'def f1(): print(name)def f2(): name = 'eric' f1() f2() # 在函數(shù)未執(zhí)行之前,作用域鏈就已經(jīng)形成了,此時(shí)f1()的上一級(jí)應(yīng)該name = ’lzl’

example 2

def scope_test(): def do_local(): spam = 'local spam' # 此函數(shù)定義了另外的一個(gè)spam字符串變量,并且生命周期只在此函數(shù)內(nèi)。此處的spam和外層的spam是兩個(gè)變量,如果寫出spam = spam + “l(fā)ocal spam” 會(huì)報(bào)錯(cuò) def do_nonlocal(): nonlocal spam # 使用外層的spam變量 test spam spam = 'nonlocal spam' def do_global(): global spam spam = 'global spam' spam = 'test spam' do_local() print('After local assignmanent:', spam) # test spam do_nonlocal() print('After nonlocal assignment:',spam) # nonlocal spam do_global() print('After global assignment:',spam) # nonlocal spam ???? 先找是本地變量,找到的本地變量已經(jīng)在do_nonlocal()里面改變了所以輸出的是nonlocal spamscope_test()print('In global scope:',spam) # global spam

以上就是深入了解Python 變量作用域的詳細(xì)內(nèi)容,更多關(guān)于Python 變量作用域的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 海鲜池-专注海鲜鱼缸、移动海鲜缸、饭店鱼缸设计定做-日晟水族厂家 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 超声波气象站_防爆气象站_空气质量监测站_负氧离子检测仪-风途物联网 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 首页_中夏易经起名网| 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | 礼堂椅厂家|佛山市艺典家具有限公司| 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 快速卷帘门_硬质快速卷帘门-西朗门业 | OpenI 启智 新一代人工智能开源开放平台 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] |