Python中,若没有使用global或nonlocal关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,但不可对其进行赋值。

摘要

Python中,

若没有使用global或nonlocal关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,不可对其进行赋值。

若使用了global或nonlocal关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,也可对其进行赋值。

故,在局部作用域中,若想使用外部命名空间中的变量,应使用global或nonlocal关键字进行声明。

这段摘要直接看,若一时难以读懂,直接看以下实例便可。

实例

菜鸟教程-Python3命名空间作用域中有一个实例,网址 Python3 命名空间和作用域 | 菜鸟教程 。

实例如下:

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”。

在函数test()这一局部作用域中,可以访问全局命名空间中的变量。

若程序改为如下:

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 testt

UnboundLocalError: local variable 'a' referenced before assignmen

错误的意思是,a还没被赋值就先被引用了。即,a在第四句“a=b”才被赋值,可是在第三句“b = a + 1”中,就先被引用读取了。

但我们不是在第一句“a = 10”,就给a赋值了吗?其实是这样的,第一句的a与第四句的a不是同一个a,是两个不同的a。

验证如下:

a = 10  
def test():
    a=1
    print(a)  # 第3句的a
test()
print(a)  # 第1句的a

运行结果如下:

1
10

进程已结束,退出代码为 0

故,在函数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关键字进行声明。

运行环境 

Python 3.9.2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值