Python全局和局部变量怎样定义和应用
Admin 2022-05-24 群英技术资讯 1011 次浏览
这篇文章主要介绍“Python全局和局部变量怎样定义和应用”,有一些人在Python全局和局部变量怎样定义和应用的问题上存在疑惑,接下来小编就给大家来介绍一下相关的内容,希望对大家解答有帮助,有这个方面学习需要的朋友就继续往下看吧。因此,当您在函数定义中定义变量时,默认情况下它们是该函数的局部变量。也就是说,您对函数体中的此类变量所做的任何操作都不会影响函数外的其他变量,即使它们具有相同的名称。换句话说,函数体是这样一个变量的范围,即这个名称与其值相关联的封闭上下文。
所有变量都有块的作用域,它们在那里被声明和定义。它们只能在声明点之后使用。
简单说一下:变量不必也不能以在 Java 或 C 等编程语言中声明的方式声明。Python 中的变量通过定义它们来隐式声明,即第一次分配值到一个变量,这个变量被声明并自动具有必须分配给它的对象的数据类型。
在下面的示例中,我们想演示如何在函数体内使用全局值:
def f ():
print ( s )
s = “我爱夏天的巴黎!”
f ()
输出:
我爱夏天的巴黎!
在调用函数 f() 之前,变量 s 被定义为字符串“我爱夏天的巴黎!”。f() 的主体仅由“print(s)”语句组成。由于没有局部变量 s,即没有赋值给 s,将使用全局变量 s 的值。所以输出将是字符串“我爱夏天的巴黎!”。问题是,如果我们在函数 f() 中改变 s 的值会发生什么?它也会影响全局变量吗?我们在下面的一段代码中对此进行了测试:
def f ():
s = "我爱伦敦!"
打印( s )
s = “我爱巴黎!”
f ()
打印( s )
输出:
我爱伦敦!
我爱巴黎!
如果我们将第一个示例与第二个示例结合起来,即我们首先使用 print() 函数访问 s,希望获得全局值,然后为其分配一个新值呢?给它赋值,意味着 - 正如我们之前所说的 - 创建一个局部变量 s。因此,我们会将 s 作为同一范围内的全局变量和局部变量,即函数体。幸运的是,Python 不允许这种歧义。因此,它会引发错误,正如我们在以下示例中所见:
def f (): print ( s ) s = “我爱伦敦!” 打印( s ) s = “我爱巴黎!” f ()
输出:
UnboundLocalError Traceback (最近一次调用最后一次)
<ipython-input-3-d7a23bc83c27> in <module>
5
6 s = “我爱巴黎!”
----> 7 f ( )
<ipython-input-3-d7a23bc83c27> in f ()
1 def f ( ) :
----> 2 print ( s )
3 s = “我
爱伦敦!” 4 打印( s )
5
UnboundLocalError:赋值前引用了局部变量“s”
变量不能在函数内既是局部的又是全局的。由于在 f() 内部为 s 赋值,因此 Python 决定我们需要一个局部变量,因此在 s 定义之前的第一个打印语句抛出了上面的错误信息。任何在函数内部更改或创建的变量都是局部变量,如果它没有被声明为全局变量。要告诉 Python,我们要使用全局变量,我们必须使用关键字“global”明确说明这一点,如下例所示:
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 17
42 15 3 4
如果我们在嵌套函数中使用 global 关键字,我们现在将检查会发生什么。以下示例显示了在各种范围内使用变量“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 中的 global 语句不会影响函数 f 的变量“city”,即它保持其值“Hamburg”。我们还可以从这个例子中推断出,在调用 f() 之后,模块命名空间中存在一个变量 'city',其值为 'Geneva'。这意味着嵌套函数中的 global 关键字不会影响其封闭命名空间的命名空间!这与我们在前一章中发现的一致:在函数内部定义的变量是局部变量,除非它明确标记为全局变量。换句话说,我们可以在任何封闭作用域中引用一个变量名,但我们只能在局部作用域中通过赋值重新绑定变量名,或者通过使用全局声明在模块全局作用域中重新绑定变量名。我们还需要一种方法来访问其他作用域的变量。这样做的方法是非局部定义,我们将在下一章解释。
Python3 引入了非局部变量作为一种新的变量。非局部变量与全局变量有很多共同点。与全局变量的一个区别在于,无法通过使用非局部语句来更改模块范围内的变量,即未在函数内部定义的变量。我们在以下两个示例中展示了这一点:
def f ():
全球 城市
打印( city )
city = "法兰克福"
f ()
输出:
法兰克福
该程序是正确的,并返回“Frankfurt”作为输出。我们将在以下程序中将“全局”更改为“非本地”:
def f ():
非本地 城市
打印( city )
city = "法兰克福"
f ()
输出:
文件“<ipython-input-9-97bb311dfb80>” ,第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 )
输出:
文件“<ipython-input-11-5417be93b6a6>” ,第4
行 非本地城市
^
语法错误:未找到非本地“城市”的绑定
该程序运行良好 - 如果我们将“非本地”更改为“全局”,在 f - 内有或没有 'city = "Munich"' 行:
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 的值现在发生了变化!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Python中的continue语句将控制返回到当前循环的开头。当遇到continue语句时,循环将不执行当前迭代中剩余的语句,而直接下一次迭代开始。
偶然从pytorch讨论论坛中看到的一个问题,KL divergence different results from tf,kl divergence 在TensorFlow中和pytorch中计算结果不同,平时没有注意到,记录下
这篇文章主要介绍了python 下载文件的几种方式分享,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
小伙伴们日常工作中都必不可少地使用Python实现一些简单的功能,但是不同的人所编写的代码执行效率往往是不同的,下面这篇文章主要给大家介绍了4个Python中高效的技巧,需要的朋友可以参考下
这篇文章主要为大家介绍了Python常用的内置函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008