Python中变量的作用域详解

 更新时间:2022年01月27日 15:02:52   作者:繁华似锦Fighting  
大家好,本篇文章主要讲的是Python中变量的作用域详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

1、作用于的概念

变量作用域指的是变量生效的范围,在Python中一共有两种作用域。

全局作用域

全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作用域。在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问。

函数作用域

函数作用域在函数调用时创建,在调用结束时销毁。函数每调用一次就会产生一个新的函数作用域(不调用不产生)。在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。

2、局部变量

所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。

def testA():
    # 局部变量a
    # 在函数中为变量赋值时,默认都是为局部变量赋值
    # 局部变量不会影响函数外的变量。
    a = 100
    # 函数体内部访问,能访问到a变量
    print(a)


testA()  # 100
print(a)  # 报错:name 'a' is not defined

变量a是定义在testA函数内部的变量,在函数外部访问则立即报错。

局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

3、全局变量

所谓全局变量,指的是在函数体内、外都能生效的变量。

思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?

答:将这个数据存储在一个全局变量里面。

# 定义全局变量a
a = 100

def testA():
    print(a)  # 访问全局变量a,并打印变量a存储的数据

def testB():
    print(a)  # 访问全局变量a,并打印变量a存储的数据

testA()  # 100
testB()  # 100

思考:testB函数需求修改变量a的值为200,如何修改程序?

a = 100

def testA():
    print(a)

def testB():
    a = 200
    print(a)

testA()  # 100
testB()  # 200
print(f'全局变量a = {a}')  # 全局变量a = 100

思考:在testB函数内部的a = 200中的变量a是在修改全局变量a吗?

答:不是。观察上述代码发现,15行得到a的数据是100,仍然是定义全局变量a时候的值,而没有返回

testB函数内部的200。综上:testB函数内部的a = 200是定义了一个局部变量。

(1)global关键字

思考:如何在函数体内部修改全局变量?

a = 100

def testA():
    print(a)

def testB():
    # 想要修改全局变量a的值是200
    # global 关键字声明a是全局变量
    global a
    a = 200
    print(a)


testA()  # 100
testB()  # 200
print(f'全局变量a = {a}')  # 全局变量a = 200

global关键字的作用是,在函数内部声明一个变量为全局变量。换句话说如果希望在函数内部修改全局变量,则需要使用global关键字来声明变量。

(2)总结

如果在函数里面直接把变量a=200赋值,此时的a不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量。函数体内部修改全局变量: 先global声明a为全局变量,然后再变量重新赋值。

4、变量的查找

当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,

如果没有则继续去上一级作用域中寻找,如果有则使用,

如果依然没有则继续去上一级作用域中寻找,以此类推。

直到找到全局作用域,依然没有找到,则会抛出异常 NameError: name 'a' is not defined

# 练习说明
a = 10
def fn2():
    def fn3():
        a = 30
        print('fn3中:','a =',a)
    fn3()
    print('fn2中:','a =',a)

fn2()
"""
输出结果:
fn3中: a = 30
fn2中: a = 10
"""

5、作用域中可变数据类型变量

c = 10
def fn4(a):
    # 在函数中对形参进行重新赋值,不会影响其他的变量
    a = 20
    print('a =', a, id(a))

fn4(c)
print('c =', c, id(c))
"""
输出结果:
a = 20 8791349231264
c = 10 8791349230944
"""


# 如果形参接收到的数据是一个全局列表
# 当在函数内尝试修改列表中的元素时,全局列表的数据也会发生改变
c = [1,2,3]
def fn4(a):
    # 如果形参执行的是一个对象,当我们通过形参去修改对象时
    # 会影响到所有指向该对象的变量
    a[0] = 100
    print('a =', a, id(a))

fn4(c)
print('c =', c, id(c))
"""
输出结果:
a = [100, 2, 3] 5132808
c = [100, 2, 3] 5132808
"""


# 如果我们不向全局变量有所改动
# 就需要使用我们之前学过的浅复制,
# 或者传入一个切片,就可以解决
c = [1, 2, 3]

def fn4(a):
    # 在函数中对形参进行重新赋值,不会影响其他的变量
    a[0] = 100
    print('a =', a, id(a))

fn4(c.copy())
# fn4(c[:])
print('c =', c, id(c))
"""
输出结果:
a = [100, 2, 3] 6050824
c = [1, 2, 3] 6050312
"""

6、多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据,如下所示:

(1)共用全局变量

# 1. 定义全局变量
glo_num = 0

def test1():
    global glo_num
    # 修改全局变量
    glo_num = 100

def test2():
    # 调用test1函数中修改后的全局变量
    print(glo_num)


# 2. 调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
# 3. 调用test2函数,执行函数内部代码:打印
test2()  # 100

(2)返回值作为参数传递

# 先得到函数一的返回值,再把这个返回值传入到函数二
def test1():
    return 50

def test2(num):
    print(num)


# 1. 保存函数test1的返回值
result = test1()

# 2.将函数返回值所在变量作为参数传递到test2函数
test2(result)  # 50

总结

到此这篇关于Python中变量的作用域详解的文章就介绍到这了,更多相关Python变量的作用域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中PySide2的安装及配置

    Python中PySide2的安装及配置

    在python中,支持图形化界面开发的库有很多,今天主要介绍一下PySide2这个库。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 实例讲解Python中sys.argv[]的用法

    实例讲解Python中sys.argv[]的用法

    在阅读facenet网络的代码的时候,遇到了sys.argv[]这个函数,所以下面这篇文章主要给大家介绍了关于Python中sys.argv[]用法的相关资料,需要的朋友可以参考下
    2021-06-06
  • 手把手教你配置JupyterLab 环境的实现

    手把手教你配置JupyterLab 环境的实现

    这篇文章主要介绍了手把手教你配置JupyterLab 环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python多线程正确用法实例解析

    Python多线程正确用法实例解析

    这篇文章主要介绍了Python多线程正确用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python模拟登入的N种方式(建议收藏)

    Python模拟登入的N种方式(建议收藏)

    这篇文章主要介绍了Python模拟登入的N种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • python3利用smtplib通过qq邮箱发送邮件方法示例

    python3利用smtplib通过qq邮箱发送邮件方法示例

    python实现邮件发送较为简单,主要用到smtplib这个模块,所以下面这篇文章主要给大家介绍了关于python3利用smtplib通过qq邮箱发送邮件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
    2017-12-12
  • pygame库实现俄罗斯方块小游戏

    pygame库实现俄罗斯方块小游戏

    这篇文章主要为大家详细介绍了pygame库实现俄罗斯方块小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 解决遇到PermissionError:[Errno 13] Permission denied:XXXX错误的问题

    解决遇到PermissionError:[Errno 13] Permission den

    遇到"PermissionError:[Errno 13] Permission denied"通常是权限不足导致,解决此问题的方法包括检查并更改文件权限,使用管理员权限运行命令,或接触文件所有者,这些步骤有助于确保用户具有执行操作所需的权限,有时,文件或目录可能被锁定
    2024-09-09
  • itchat和matplotlib的结合使用爬取微信信息的实例

    itchat和matplotlib的结合使用爬取微信信息的实例

    下面小编就为大家带来一篇itchat和matplotlib的结合使用爬取微信信息的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Python实现语音识别Whisper的使用示例

    Python实现语音识别Whisper的使用示例

    Whisper是由OpenAI基于Python开发的能够识别多国语言的语音识别模型,本文主要介绍了Python实现语音识别Whisper的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论