Python 官方文档:入门教程 => 点击学习
这篇“python中变量的作用域实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中变量的作用域实例分析”文
这篇“python中变量的作用域实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中变量的作用域实例分析”文章吧。
变量作用域指的是变量生效的范围,在Python中一共有两种作用域。
全局作用域
全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作用域。在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问。
函数作用域
函数作用域在函数调用时创建,在调用结束时销毁。函数每调用一次就会产生一个新的函数作用域(不调用不产生)。在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def testA(): # 局部变量a # 在函数中为变量赋值时,默认都是为局部变量赋值 # 局部变量不会影响函数外的变量。 a = 100 # 函数体内部访问,能访问到a变量 print(a)testA() # 100print(a) # 报错:name 'a' is not defined
变量a
是定义在testA
函数内部的变量,在函数外部访问则立即报错。
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
所谓全局变量,指的是在函数体内、外都能生效的变量。
思考:如果有一个数据,在函数A
和函数B
中都要使用,该怎么办?
答:将这个数据存储在一个全局变量里面。
# 定义全局变量aa = 100def testA(): print(a) # 访问全局变量a,并打印变量a存储的数据def testB(): print(a) # 访问全局变量a,并打印变量a存储的数据testA() # 100testB() # 100
思考:testB
函数需求修改变量a
的值为200,如何修改程序?
a = 100def testA(): print(a)def testB(): a = 200 print(a)testA() # 100testB() # 200print(f'全局变量a = {a}') # 全局变量a = 100
思考:在testB
函数内部的a = 200
中的变量a
是在修改全局变量a
吗?
答:不是。观察上述代码发现,15行得到a
的数据是100,仍然是定义全局变量a
时候的值,而没有返回
testB
函数内部的200。综上:testB
函数内部的a = 200
是定义了一个局部变量。
(1)global关键字
思考:如何在函数体内部修改全局变量?
a = 100def testA(): print(a)def testB(): # 想要修改全局变量a的值是200 # global 关键字声明a是全局变量 global a a = 200 print(a)testA() # 100testB() # 200print(f'全局变量a = {a}') # 全局变量a = 200
global
关键字的作用是,在函数内部声明一个变量为全局变量。换句话说如果希望在函数内部修改全局变量,则需要使用global
关键字来声明变量。
(2)总结
如果在函数里面直接把变量a=200赋值,此时的a
不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量。函数体内部修改全局变量: 先global
声明a
为全局变量,然后再变量重新赋值。
当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,
如果没有则继续去上一级作用域中寻找,如果有则使用,
如果依然没有则继续去上一级作用域中寻找,以此类推。
直到找到全局作用域,依然没有找到,则会抛出异常 NameError: name 'a' is not defined
。
# 练习说明a = 10def fn2(): def fn3(): a = 30 print('fn3中:','a =',a) fn3() print('fn2中:','a =',a)fn2()"""输出结果:fn3中: a = 30fn2中: a = 10"""
c = 10def fn4(a): # 在函数中对形参进行重新赋值,不会影响其他的变量 a = 20 print('a =', a, id(a))fn4(c)print('c =', c, id(c))"""输出结果:a = 20 8791349231264c = 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] 5132808c = [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] 6050824c = [1, 2, 3] 6050312"""
一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据,如下所示:
(1)共用全局变量
# 1. 定义全局变量glo_num = 0def test1(): global glo_num # 修改全局变量 glo_num = 100def test2(): # 调用test1函数中修改后的全局变量 print(glo_num)# 2. 调用test1函数,执行函数内部代码:声明和修改全局变量test1()# 3. 调用test2函数,执行函数内部代码:打印test2() # 100
(2)返回值作为参数传递
# 先得到函数一的返回值,再把这个返回值传入到函数二def test1(): return 50def test2(num): print(num)# 1. 保存函数test1的返回值result = test1()# 2.将函数返回值所在变量作为参数传递到test2函数test2(result) # 50
以上就是关于“Python中变量的作用域实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网Python频道。
--结束END--
本文标题: Python中变量的作用域实例分析
本文链接: https://lsjlt.com/news/321616.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0