发表日期: 2022-07-04 14:12:38 浏览次数:25
高端!网站定制/设计/优化/二次开发/制作/搭建-佛山高端网站建设
错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。
修改 a 为全局变量:
执行输出结果为:
也可以通过函数参数传递:
执行输出结果为:
过函数参数传递:
实例(Python 3.0+)
#!/usr/bin/python3
a = 10
def test(a):
a = a + 1
print(a)
test(a)
执行输出结果为:
11
Python3 面向对象Python3 标准库概览
4 篇笔记 写笔记
alibi
ali***jia@qq.com
316
作为一个从 Java 过来的人来说,Python 的作用域有点奇葩,作为开发者,只需要关注全局作用域和局部作用域就好了,全局作用域就是说白了模块(单个 .py 文件中)直接声明的变量。
比如有个 demo.py 的文件,含有以下代码:
var_global='global_var'#这个var_global就是全局作用域
def globalFunc():
var_local='local_var' #这个就是局部变量
class demo():
class_demo_local_var='class member' #这里也是局部变量
def localFunc(self):
var_locals='local_func_var'#这里也是局部变量
以上只是说明了全局变量仅仅是在 .py 文件中直接声明的变量叫全局变量,还有在 .py 文件中直接写的逻辑代码块中,也是全局变量。也就是说在 if/elif/else/、try/except、for/while 等逻辑代码块中的变量。
这个教程中在介绍三种命令空间的时候,说查找变量的顺序为局部的命名空间去 -> 全局命名空间 -> 内置命名空间,但是我理解的变量查找顺序为:当前域 -> 外部域(如果有) -> 全局域 -> 内置域。
光说没有什么概念,我们来一段代码就清楚了。
我们以 demo1.py 为例子:
global_var='this var on global space'
'''
申明global_var这个位置就是全局域,也就是教程中所说的全局作用域,
同时它也是直接声明在文件中的,而不是声明在函数中或者类中的变量
'''
class demo():
class_demo_local_var='class member'
'''
虽然class_demo_local_var在这里是局部变量,这个局部变量的域相对于var_locals是外部域,
所以可以直接被var_locals所在的更小的局部域访问
'''
def localFunc(self):
var_locals='local_func_var'
'''
这里也是局部变量,但是相对于class_demo_local_var变量,却是更小的域,
因此class_demo_local_var所在的哪个域无法访问到当前域来
'''
print(self.class_demo_local_var)#到这里会查找当前域中有没有class_demo_local_var这个变量,然后再到相对于当前域的外部域去查找变量
alibi
alibi
ali***jia@qq.com
3年前 (2019-10-20)
tempo
luo***7@iccas.ac.cn
183
教程中写到 Python 中变量的查找顺序:“在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再去内置中找。可以看一个具体的例子。
Python 的一个内建值 int,我们首先将其赋值为 0,然后定义一个函数 fun1()。
int = 0
def fun1():
int = 1
def fun2():
int = 2
print(int)
fun2()
fun1() # 输出 2
函数 fun1() 的作用就是调用函数 fun2() 来打印 int 的值。
输出结果为:2
因为 local 中的 int = 2,函数将其打印出来。
将函数 fun2() 中的 int = 2 删除:
int = 0
def fun1():
int = 1
def fun2():
print(int)
fun2()
fun1() # 输出 1
调用函数 fun1() 输出结果为:1
因为 local 找不到 int 的值,就去上一层 non-local 寻找,发现 int = 1 并打印。
而进一步删除函数 fun1() 中的 int = 1:
int = 0
def fun1():
def fun2():
print(int)
fun2()
fun1() # 输出 0
调用函数 fun1() 输出结果为:0
因为 local 和 non-local 都找不到 int 的值,便去 global 中寻找,发现 int = 0 并打印。
若删除 int = 0这一条件:
def fun1():
def fun2():
print(int)
fun2()
fun1()
调用函数 fun1() 输出结果如下:
<class 'int'>
因为 local、non-local、global 中都没有 int 的值,便去 built-in 中寻找 int 的值,即:
>>> int
<class 'int'>
tempo
tempo
luo***7@iccas.ac.cn
3年前 (2019-12-16)
GsxxInRnb
993***819@qq.com
参考地址
19
若没有使用 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,不可对其进行赋值。
对于教程中的这个实例:
a = 10
def test():
a = a + 1
print(a)
test()
运行后如下:(提示出错)
Traceback (most recent call last):
File "<input>", line 5, in <module>
File "<input>", line 3, in test
UnboundLocalError: local variable 'a' referenced before assignment
若程序改为如下:
a = 10
def test():
b = a + 1
print(b)
test()
运行结果:(正常运行)
11
在函数 test() 中,可以读取全局命名空间中的 “a”,对应语句 “b=a+1”。
即在局部作用域中,可以访问全局命名空间中的变量。
若程序改为如下:
a = 10
def test():
b = a + 1
a=b
print(b)
test()
运行:(提示出错)
Traceback (most recent call last):
File "<input>", line 6, in <module>
File "<input>", line 3, in test
UnboundLocalError: local variable 'a' referenced before assignment
错误的原因在于语句 “a=b”,对 “a” 进行赋值是不可以的。
即在函数 test() 中,不可以直接对全局命名空间中的 “a” 进行赋值。
若程序改为如下:
a = 10
def test():
global a
b = a + 1
a=b
print(b)
test() #输出b
print(a) #输出a
运行:(正常运行)
11
11
语句 “global a” 声明了 “a” 采用全局命名空间中的 “a”,这样便可在
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878