python 函数作用域&全局变量&局部变量笔记

本文介绍了Python中的函数作用域、全局变量和局部变量的概念,通过代码示例详细阐述了它们的使用和区别。强调了函数执行时的命名空间搜索顺序,以及全局变量和局部变量的生命周期。同时,通过示例解释了为何在不同区域调用变量会导致不同的结果,并讨论了变量赋值的过程。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录学习中知识点

一、名词解释

全局变量和局部变量:
函数的参数以及函数体中定义的所有变量,共同构成了该函数的本地命名空间,所有的变量被称为该函数的本地变量,这些变量的作用范围只是在函数中有用。所以也称为局部变量,不是本地变量的变量被称为全局变量。
系统每次执行一个函数时,就会创建新的本地(局部)命名空间。改命名空间代表一个局部环境,解析这些名称时解释器将首先搜索局部命名空间,如果局部命名空间中没有找到匹配的值,就会在全局命名空间找,如果全局命名空间也没有匹配的值,最后会在内置命名空间中找,如果还找不到就会抛出NameError错误。

二、使用步骤

1,函数作用域

函数模板:
def 函数名( [参数] ):
函数体
[return 返回值]

在这里插入图片描述
代码示例1
1 def func():#定义函数
2 a = 8 #a是局部变量,此变量的作用范围就是行2和行3
3 print(a)
4 priint(a) #此处a会报错。因为a的作用域就是行2,3。超出行2,3范围后a就不能被调用了,就会报错。报错信息:NameError: name 'a ’ in not defined.

在这里插入图片描述

2,全局变量&局部变量

全局变量:在class和def间且和def齐头写,在py文件的任何位置都能调用

局部变量:在def中且有缩进,在py文件中只能函数体中调用,其他任何地方不能调用。

注:在def和def间且有缩进的变量叫闭包变量,这里简单的记录下

代码示例2
1, age = 18 #全局变量
2, def func():
3, name = ‘李四’ #局部变量
4, print(name=',name)
5,print(‘age=’,age) #此程序运行结果输出的是 18在这里插入图片描述
为什么输出结果不是name=李四和age=18呢?
程序中第一行定义一个全局变量age并给age赋值18,也叫赋值即定义,第2行定义一个函数func,第3,4行,定义一个局部变量和输出局部变量,第5行数据age
至于为什么输出结果只有age=18,而不是name=李四和age=18呢?是因为在程序中如果函数没有被调用,就不会被执行,即上面的程序用只定义个函数func,并没有调用函数func,所以输出结果就不会有name=李四。

代码示例3
1, age = 18 #全局变量
2, def func():
3, age = 8 #这里的age是局部变量,将20赋值给age(赋值即定义)
3, name = ‘李四’ #局部变量
4, print(name=',name,‘age=,age’)
5,print(‘name=’,name,‘age=’,age) #此处name会报错,name超出的它 的作用范围,报NameError错误
在这里插入图片描述
可能会有疑问,为什么全局变量和局部变量一样呢,而且还不报错,将代码修改,就可以看清楚了,修改成代码示例4

代码示例4
1,age = 18
2,print(‘age_id=’,id(age)),
3,def func():
4, age=8
5, print(‘ageid=’,id(age))
6, name = ‘李四’
7, print(‘name=’,name,‘age=’,age)
8,print(‘age=’,age)
9,func()
我们在程序第2行,第5行使用id函数,分别将age的在运行环境中的地址打印出来,第2行输出:age_id= 1864134208,第5行输出:ageid= 1864133888
可以看出两个age的指向不是一个地址,那为什么会执行第5,7行代码呢?是因为我们在程序新增一行代码即第9行,第9行的意思就是调用函数func,这样就会执行函数func中的函数体了,执行顺序是从上而下执行。
在这里插入图片描述
代码示例5;
1,age = 18
2,print(‘age_id=’,id(age)),
3,def func():
4, myage= age +1
5, print(‘ageid=’,id(myage))
6, name = ‘李四’
7, print(‘name=’,name,‘myage=’,myage)
8,func(),
9,print(‘age=’,age)

在程序的第4行,先在本地命名空间找age,本地命名空间没找到,就去全局命名空间找,找到age=18,
之后在执行18+1然后在将19赋值给myage
注:变量赋值过程是先执行 ‘=’ 右边的,执行往后在赋值非‘=’左边的变量
在这里插入图片描述

总结

加油!加油!加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值