Python变量的作用域

一、概要

变量的作用域是指变量的作用范围,即定义一个变量后,在哪些地方可以使用这个变量。按照作用域的不同,Python 中的变量可以分为局部变量和全局变量。

二、局部变量

在一个函数中定义的变量就是局部变量(包括形参),其作用域是从定义局部变量的位置至函数结束的位置。

def foo(x):
    print('Foo 中的 x:', x)
    x = 100
    print('Foo 中修改后的 x:', x)

def bar():
    x = 10
    print('Bar 中的 x:', x)
    foo(1000)
    print('调用 Foo 后的 x:', x)

bar()

输出结果:

Bar 中的 x: 10
Foo 中的 x: 1000
Foo 中修改后的 x: 100
调用 Foo 后的 x: 10

解析:

  1. 首先运行 bar() 函数,创建了 bar() 中的局部变量 x,并赋值为10。
  2. 然后调用 foo()函数,形参为1000,即此时 foo 中的局部变量 x 为1000。
  3. 打印此时 foo 中的 x,数值为1000。
  4. 将 foo 中的局部变量 x 重新赋值为100,并打印。
    1. foo 函数运行结束,foo 中的 x 作用结束,所以回到 bar 函数中,打印 bar 中的局部变量 x 为10。

三、全局变量

在所有函数外定义的变量就是全局变量,其在所有的函数中都能使用。

def foo():
    print('Foo 中的 x:', x)

def bar():
    x = 100
    foo()
    print('Bar 中的 x:', x)

x = 20
foo()
bar()
foo()

输出结果:

Foo 中的 x: 20
Foo 中的 x: 20
Bar 中的 x: 100
Foo 中的 x: 20

第5行代码实际上是在 bar 函数中定义了一个局部变量 x 并将其赋值为 100,而不是修改全局变量 x 的值。所以无论是在bar 函数内部再调用 foo 函数,还是之后调用 foo 函数,其打印的 x 值都为20。

四、global关键字

如果我们想要在一个函数中对全局变量进行修改,怎么办呢?这个时候就可以使用 global 关键字了。在函数体内定义,并且使用global关键字修饰后,该变量也就变为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以对其进行修改。

def foo():
    print('Foo 中的 x:', x)


def bar():
    global x
    x = 100
    foo()
    print('Bar 中的 x:', x)


x = 20
foo()
bar()
foo()

输出结果:

Foo 中的 x: 20
Foo 中的 x: 100
Bar 中的 x: 100
Foo 中的 x: 100

tip: 尽管Python允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。

五、nonlocal 关键字

在 Python 中,函数的定义可以嵌套,即在一个函数中包含另一个函数的定义。通过 nonlocal 关键字,可以使内层的函数直接使用外层函数中定义的变量。

不使用 nonlocal 的例子:

def outer():
    x = 10
    def inner():
        x = 20
        print('inner 函数中 x 的值为', x)
    inner()
    print('outer 函数中 x 的值为', x)
outer()

输出结果:

inner 函数中 x 的值为 20
outer 函数中 x 的值为 10

使用 nonlocal 的例子:

def outer():
    x = 10
    def inner():
        nonlocal x
        x = 20
        print('inner 函数中 x 的值为', x)
    inner()
    print('outer 函数中 x 的值为', x)
outer()

输出结果:

inner 函数中 x 的值为 20
outer 函数中 x 的值为 20

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值