ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入了解python全局变量,局部变量和命名空间

深入了解python全局变量,局部变量和命名空间 所以, 要是您于函数定义里定义变量, 在默认情形下它们属于该函数的局部变量。这意味着, 您针对函数体里的这类变量所开展的任何行为, 都不会对函数外的其他变量产生影响, 哪怕它们有着相同的名称。换句话讲, 函数体是这样一种变量的区间, 就是该名称与其值相联系的封闭环境。变量的特点是, 所有变量都存在块的作用域, 在该作用域里变量被声明, 同时被定义, 变量的使用规则是, 只能在声明点之后使用。简而言之: 变量没必要且不可以用在诸如Java、C等编程语言里声明的那种方式去声明。其中的变量借助定义它们来进行隐式声明, 也就是说, 当首次给一个变量赋值时, 这个变量就被声明了, 并且会自动拥有必须赋予它的对象的数据类型。要是您在理解这一点上碰到问题, 那就去查阅我们有关数据类型和变量的章节, 去查看左侧的链接。函数中的全局和局部变量在下面的示例中我们想演示如何在函数体内使用全局值def f (): print ( s ) s “我爱夏天的巴黎” f ()输出我爱夏天的巴黎变量 s 被定义成字符串“我爱夏天的巴黎”之时, 比在调用函数 f() 之前, f() 的主体仅仅是由“print(s)”语句所构成, 因为不存在对应赋给 s 的局部变量 s, 故而会用上全局变量 s 的值, 于是输出将会是字符串“我爱夏天的巴黎”, 问题在于, 要是我们于函数 f() 里对 s 的值作出改变, 那会出现什么情况, 它又是否会对全局变量产生影响, 我们于下面的一段代码当中针对此进行了相应的测试:def f (): s 我爱伦敦 打印( s ) s “我爱巴黎” f () 打印( s )输出我爱伦敦我爱巴黎要是我们把第一个示例跟第二个示例合并起来, 也就是我们先运用print()函数去访问s, 期望得到全局值, 接着给它赋予一个新值怎样呢? 给它赋值, 这指的是 - 就像我们之前提到的 - 去创建一个局部变量s。所以, 我们会把s当作同一范围内的全局变量以及局部变量, 也就是函数体。幸运的是, 不允许存在这种歧义。因而, 它会引发错误, 就如同我们在下面的示例中所看到的:def f (): print ( s ) s “我爱伦敦” 打印( s ) s “我爱巴黎” f ()输出(最近一次调用最后一次)in6 s “我爱巴黎”---- 7 f ( )in f ()1 def f ( ) :---- 2 print ( s )3 s “我爱伦敦” 4 打印( s )赋值前引用了局部变量“s”变量没办法在函数之内, 同时具备局部的以及全局的特性。鉴于在f()内部针对s进行了赋值操作, 所以, 我们因此判定需要一个局部变量, 故而在s定义前的头一个打印语句, 抛出了上面所讲到的错误信息。任何于函数内部被更改或者创建的变量, 倘若它未曾被声明为全局性变量, 便是局部变量。若要告知其我们打算使用全局变量, 那我们必须运用关键字“”清晰地表明这一点, 就如同下面这个例子所呈现的那样:def f (): global s print ( s ) s 只在春天但伦敦也很棒 打印( s ) s 我在巴黎找课程 f () 打印( s )输出我正在巴黎寻找课程只在春天但伦敦也很棒只在春天但伦敦也很棒外部无法访问函数调用完成后的函数局部变量, 此为上一个例子的延续。def f (): s 我在全球范围内不为人知 打印( s ) f () 打印( s )输出我在全球不为人知只在春天但伦敦也很棒以下示例显示了局部和全局变量以及函数参数的狂野组合def foo ( x , y ): 全局 a a 42 x , y y , x b 33 b 17 c 100 打印( a , b , x , y ) a , b , x , y 1 , 15 , 3 , 4 foo ( 17 , 4 ) 打印( a , b , x , y )输出42 17 4 1742 15 3 4嵌套函数中的全局变量要是我们于嵌套函数当中运用关键字, 此刻我们就要去核查会出现啥情况。下面这个示例展现了在各类范围里运用变量“city”的情形:def f (): city Hamburg def g (): global city city Geneva print ( 调用前g: city ) print ( 现在调用g: ) g () print ( 调用后g: 城市) f () print ( 主城的值 city )输出之前打电话给g汉堡现在调用 g打电话后g汉堡主要城市价值日内瓦我们能够看到, 嵌套函数g里的语句, 不会对函数f的变量“city”产生影响, 也即是它会维持其值为“”。我们同样能够从这一例子当中推导得出, 在对f()进行调用之后, 模块命名空间里存在着一个变量city, 它的值是。这表明嵌套函数中的关键字, 不会对其封闭命名空间的命名空间造成影响这跟我们在前一章里所发现的情况相契合: 在函数内部被定义的变量属于局部变量, 除非它被明确标记成全局变量。换一种说法来讲, 我们能够在任意封闭作用域里引用一个变量名, 然而我们可在局部作用域里, 唯有通过赋值去重新绑定变量名, 或者借助使用全局声明于模块全局作用域中重新绑定变量名。我们也还需要一种途径来访问其他作用域的变量。而这样做的办法是采用非局部定义, 我们会在下一章予以解释。非局部变量有一种新变量被引入了, 它是非局部变量。非局部变量跟全局变量有着诸多相同点。不过, 和全局变量存在一个差异, 那就是在模块范围内, 也就是未于函数内部定义的变量, 没办法借助非局部语句去更改它。在下面这两个示例里, 我们把这一点展示出来了:def f () 全球 城市 打印( city ) city 法兰克福 f ()输出法兰克福这个程序是对的, 会返回空字符串当作输出。接下来的程序里, 我们要把“全局”改成“非本地”:def f (): 非本地 城市 打印( city ) city 法兰克福 f ()输出文件“” 第2行 非本地城市语法错误未找到非本地“城市”的绑定这显示出, 非局部绑定唯有在嵌套函数的内里才能够运用, 一定要于封闭的函数作用域当中对非局部变量开展定义, 要是变量并没有在封闭函数作用域里被定义, 那么该变量就不可以在嵌套作用域里进行定义, 此乃是与“全局”语义的另外一处不一样的地方。def f (): city Munich def g (): nonlocal city city Zurich print ( 调用前g: city ) print ( 现在调用g: ) g () print ( 调用后g: 城市) city Stuttgart f () print ( city in main: city )输出打电话之前 g: 慕尼黑现在调用 g拨打 g 后苏黎世主要的“城市”斯图加特于先前的例子里头, 变量 city 是于调用 g 之前就已被定义的。要是未曾进行定义的话, 我们将会获取到一个错误:高清 ˚F #city “慕尼黑” 高清 g ^ 外地 市 城市 “苏黎世” 打印“呼叫摹前” 城市 打印“立即致电G” g ^ 打印“后呼叫 g: city ) city Stuttgart f () print ( city in main: city )输出文件“”第4行 非本地城市语法错误未找到非本地“城市”的绑定这个程序运行得挺不错, 要是我们把“非本地”换成“全局”, 在f里面, 不管有没有 city 这一行时:def f (): #city Munich def g (): global city city Zurich print ( Before call g: city ) print ( Calling g now: ) g () print ( After 调用g: )呼叫 g: city ) city Stuttgart f () print ( city in main: city )输出打电话之前斯图加特现在调用 g拨打 g 后苏黎世主要的“城市”苏黎世然而有一个巨大的不同全局 x 的值现在发生了变化
返回列表