日期: 2022-09-21 05:36:48 浏览数:4

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
广元设计网页公司

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
参考地址
22
若没有使用 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”,这样便可在函数 test() 中,对全局命名空间中的 “a” 直接进行赋值了。
若没有使用 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,不可对其进行赋值。
若使用了 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,也可对其进行赋值。
故,在局部作用域中,若想使用外部命名空间中的变量,应使用 global 或 nonlocal 关键字进行声明。
GsxxInRnb
GsxxInRnb
993***819@qq.com
参考地址
1年前 (2021-07-24)
fenglu
250***819@qq.com
22
楼上讲的结论是对的,但中间的逻辑是不对的。
a = 10
def test():
b = a + 1
a=b
print(b)
test()
运行后会报错:
UnboundLocalError: local variable 'a' referenced before assignment
这里说的很清楚啊,压根不是对全局变量赋值导致的错误,而是因为通过“a=b”定义了局部变量a,但是局部变量a在前一句“b=a+1”中被引用了,也就是说先使用,然后才定义的,这里的“b=a+1”中a被解析成了局部变量。
那为什么去掉“a=b”就没问题了呢?
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
为一个从 Java 过来的人来说,Python 的作用域有点奇葩,作为开发者,只需要关注全局作用域和局部作用域就好了,全局作用域就是说白了模块(单个 .py 文件中)直接声明的变量。
比如有个 demo.py 的文件,含有以下代码:
以上只是说明了全局变量仅仅是在 .py 文件中直接声明的变量叫全局变量,还有在 .py 文件中直接写的逻辑代码块中,也是全局变量。也就是说在 if/elif/else/、try/except、for/while 等逻辑代码块中的变量。
这个教程中在介绍三种命令空间的时候,说查找变量的顺序为局部的命名空间去 -> 全局命名空间 -> 内置命名空间,但是我理解的变量查找顺序为:当前域 -> 外部域(如果有) -> 全局域 -> 内置域。
光说没有什么概念,我们来一段代码就清楚了。
我们以 demo1.py 为例子:
alibi
ali***jia@qq.com
tempo
luo***7@iccas.ac.cn
教程中写到 Python 中变量的查找顺序:“在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再去内置中找。可以看一个具体的例子。
Python 的一个内建值 int,我们首先将其赋值为 0,然后定义一个函数 fun1()。
函数 fun1() 的作用就是调用函数 fun2() 来打印 int 的值。
输出结果为:2
因为 local 中的 int = 2,函数将其打印出来。
将函数 fun2() 中的 int = 2 删除:
调用函数 fun1() 输出结果为:1
因为 local 找不到 int 的值,就去上一层 non-local 寻找,发现 int = 1 并打印。
而进一步删除函数 fun1() 中的 int = 1: