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

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

什么是Python變量作用域

瀏覽:51日期:2022-07-23 09:26:34

在程序中定義一個變量時,這個變量是有作用范圍的,變量的作用范圍被稱為它的作用域。

根據定義變量的位置,變量分為兩種:

局部變量:在函數中定義的變量,包括參數,都被稱為局部變量。 全局變量:在函數外面、全局范圍內定義的變量,被稱為全局變量。

每個函數在執行時,系統都會為該函數分配一塊“臨時內存空間”,所有的局部變量都被保存在這塊臨時內存空間內。當函數執行完成后,這塊內存空間就被釋放了,這些局部變量也就失效了,因此離開函數之后就不能再訪問局部變量了。

全局變量意味著它們可以在所有函數內被訪問。

不管是在函數的局部范圍內還是在全局范圍內,都可能存在多個變量,每個變量“持有”該變量的值。從這個角度來看,不管是局部范圍還是全局范圍,這些變量和它們的值就像一個“看不見”的字典,其中變量名就是字典的 key,變量值就是字典的 value。

實際上,Python 提供了如下三個工具函數來獲取指定范圍內的“變量字典”:

globals():該函數返回全局范圍內所有變量組成的“變量字典”。

locals():該函數返回當前局部范圍內所有變量組成的“變量字典”。

vars(object):獲取在指定對象范圍內所有變量組成的“變量字典”。如果不傳入object 參數,vars() 和 locals() 的作用完全相同。

globals() 和 locals() 看似完全不同,但它們實際上也是有聯系的,關于這兩個函數的區別和聯系大致有以下兩點:

locals() 總是獲取當前局部范圍內所有變量組成的“變量字典”,因此,如果在全局范圍內(在函數之外)調用 locals() 函數,同樣會獲取全局范圍內所有變量組成的“變量字典”;而 globals() 無論在哪里執行,總是獲取全局范圍內所有變量組成的“變量字典”。

一般來說,使用 locals() 和 globals() 獲取的“變量字典”只應該被訪問,不應該被修改。但實際上,不管是使用 globals() 還是使用 locals() 獲取的全局范圍內的“變量字典”,都可以被修改,而這種修改會真正改變全局變量本身:但通過 locals() 獲取的局部范圍內的“變量字典”,即使對它修改也不會影響局部變量。

下面程序示范了如何使用 locals()、globals() 函數訪問局部范圍和全局范圍內的“變量字典”:

def test (): age = 20 # 直接訪問age局部變量 print(age) # 輸出20 # 訪問函數局部范圍的“變量數組” print(locals()) # {’age’: 20} # 通過函數局部范圍的“變量數組”訪問age變量 print(locals()[’age’]) # 20 # 通過locals函數局部范圍的“變量數組”改變age變量的值 locals()[’age’] = 12 # 再次訪問age變量的值 print(’xxx’, age) # 依然輸出20 # 通過globals函數修改x全局變量 globals()[’x’] = 19x = 5y = 20print(globals()) # {..., ’x’: 5, ’y’: 20}# 在全局訪問內使用locals函數,訪問的是全局變量的“變量數組”print(locals()) # {..., ’x’: 5, ’y’: 20}# 直接訪問x全局變量print(x) # 5# 通過全局變量的“變量數組”訪問x全局變量print(globals()[’x’]) # 5# 通過全局變量的“變量數組”對x全局變量賦值globals()[’x’] = 39print(x) # 輸出39# 在全局范圍內使用locals函數對x全局變量賦值locals()[’x’] = 99print(x) # 輸出99

從上面程序可以清楚地看出,locals() 函數用于訪問特定范圍內的所有變量組成的“變量字典”,而 globals() 函數則用于訪問全局范圍內的全局變量組成的“變量字典”。

全局變量默認可以在所有函數內被訪問,但如果在函數中定義了與全局變量同名的變量,此時就會發生局部變量遮蔽(hide)全局變量的情形。例如如下程序:

name = ’Charlie’def test (): # 直接訪問name全局變量 print(name) # Charlietest()print(name)

上面程序中,第 4 行直接訪問 name 變量,這是允許的,此時程序將會輸出 Charlie。如果在此之后增加如下一行代碼:

name = ’孫悟空’

再次運行該程序,將會看到如下錯誤:

UnboundLocalError : local variable ‘name’ referenced before assignment

該錯誤提示粗體字代碼所訪問的 name 變量還未定義。這是什么原因呢?這正是由于程序在 test() 函數中增加了“name=’孫悟空’”一行代碼造成的。

Python 語法規定,在函數內部對不存在的變量賦值時,默認就是重新定義新的局部變量。因此這行代碼相當于重新定義了 name 局部變量,這樣 name 全局變量就被遮蔽了,所以程序會報錯。

為了避免這個問題,可以通過以下兩種方式來修改上面程序:

訪問被遮蔽的全局變量。如果希望程序依然能訪問 name 全局變量,且在函數中可重新定義 name 局部變量,也就是在函數中可以訪問被遮蔽的全局變量,此時可通過 globals() 函數來實現,將上面程序改為如下形式即可:

name = ’Charlie’def test (): # 直接訪問name全局變量 print(globals()[’name’]) # Charlie name = ’孫悟空’test()print(name) # Charlie

在函數中聲明全局變量。為了避免在函數中對全局變量賦值(不是重新定義局部變量),可使用 global 語句來聲明全局變量。因此,可將程序改為如下形式:

name = ’Charlie’def test (): # 聲明name是全局變量,后面的賦值語句不會重新定義局部變量 global name # 直接訪問name全局變量 print(name) # Charlie name = ’孫悟空’test()print(name) # 孫悟空

增加了“global name”聲明之后,程序會把 name 變量當成全局變量,這意味著 test() 函數后面對 name 賦值的語句只是對全局變量賦值,而不是重新定義局部變量。

知識點擴展:

python3 之 變量作用域

作用域: 指命名空間可直接訪問的python程序的文本區域,這里的 ‘可直接訪問’ 意味著:對名稱的引用(非限定),會嘗試在命名空間中查找名稱;

L:local,局部作用域,即函數中定義的變量; E:enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的; G:globa,全局變量,就是模塊級別定義的變量; B:built-in,內建作用域,系統固定模塊里面的變量,比如:int,bytearray等

到此這篇關于什么是Python變量作用域的文章就介紹到這了,更多相關Python變量作用域詳解內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 路面机械厂家| 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 谷梁科技| 泰安办公家具-泰安派格办公用品有限公司 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 山东包装,山东印刷厂,济南印刷厂-济南富丽彩印刷有限公司 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 间苯二酚,间苯二酚厂家-淄博双和化工 | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | 高中学习网-高考生信息学习必备平台 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 |