曾经学C++的时候,经常听到这个名词,它主要是为了避免命名冲突而产生的。
就像有A(4个苹果),B(6个苹果)两个人,10个苹果,如果只标签了苹果,你无法判断哪个苹果是属于哪个人的,因为标签都是一样的;但是如果标签是A.苹果,B.苹果,那么是不是很容易就知道了苹果是谁的了。
命名空间:提供了一种从名称到对象的映射;主要是通过字典来实现的。
在python中,函数、模块等都有自己的命名空间:
局部命名空间(local namespace):即函数中定义的名称 —— 包括函数中的变量、参数、局部变量等;
全局命名空间(global namespace):即模块中定义的名称 —— 包括模块中的变量、函数、类、参数、常量、导入(import)的模块等;
内置命名空间(built-in namespace):即python内置的名称 —— 包括各种内置函数、Exception等;
而,当python需要使用变量时,会在上述命名空间中依次查找,顺序是:
局部命名空间,全局命名空间、内置命名空间。
同一命名空间中不能有重名,但不同命名空间可以。
可以通过locals()、globals() 函数来获取命名空间的值(字典),在程序的不同位置执行结果不一定一致,因为结果是针对当前位置来说的。
locals()
globals()
可以通过字典形式获取其中的值:
作用域:可以理解为变量所起作用的范围,超出范围则某变量不能被使用。在python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则报错。Python 中只有模块(module),类(class)以及函数(def、lambda)才会产生新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会产生新的作用域的。
作用域可以分为四种:
Local:最内层,包含局部变量,一般指的是函数内部的作用域;
Enclosing:包含非局部但是也不是全局的变量,主要是嵌套时,外层函数的变量,那么相对内层函数来说,嵌套的外层函数中的变量既不是局部变量也不是全局变量。
Global:全局变量,例如当前模块中的全局变量。
Build-in:内置变量。
查找顺序一般是:Local--->Enclosing--->Global--->Build-in
def test1(): x1 = 1 #Enclosing 作用域 def test2(): x2 = 1 #Local 作用域 print('x2=',x2) x1 = 100 #很明显,外层作用域中的x1没有受到影响,因为这里的x1属于Local test2() return x1 aa = test1() print('aa=',aa)
要想修改外层作用域(上层)的变量,需要用到global和nonlocal关键字。(注意,修改和访问不是一样的程度)
def test1(): x1 = 1 #Enclosing 作用域 def test2(): x2 = 1 #Local 作用域 print('x2=',x2) nonlocal x1 x1 = 100 #通过nonlocal,将这里的x1作用域变化为Enclosing作用域,即影响到Enclosing作用域中的x1的值 test2() return x1 aa = test1() print('aa=',aa)
def test1(): x1 = 1 # 这个x1属于Enclosing 作用域 def test2(): x2 = 1 #Local 作用域 print('x2=',x2) global x1 # 这个x1属于全局作用域 x1 = 100 #这里影响的是全局作用域中的x1值,并不会影响到Enclosing作用域中的值 test2() return x1 #返回的是当前作用域Enclosing中的x1的值 aa = test1() print('aa=',aa) print('x1=',x1)
全局变量和局部变量
定义在函数内部的变量,拥有局部作用域,属于局部变量。
定义在函数外部的变量,拥有全局作用域,属于全局变量。
全局变量可以在整个全局作用域内访问,但是要修改的话,需要用到global关键字。
更细节一点,若涉及到class:
全局变量:一般在模块内、在所有函数外面、在class外面的变量。
局部变量:一般在函数内、在class的方法内(未加self修饰)的变量。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】