前言
最近,我在群里答疑的时候,经常碰到,小伙伴,再变量,缩进,参数,方面使用错误,导致程序运行不来。
今天,打算自己写一篇。
Python 变量作用域,和生命周期。
彻底弄懂变量该怎么使用。
知识点
变量的使用,有作用域区别,也有生命周期的区别。
1.变量作用域
局部变量
python能够影响变量作用域的代码段是def、class、lamda。
def scopeTest():
localValur = 6
print(localValur)
scopeTest()
# print(localValur) #去除注释这里会报错,因为localValur是本地变量
输出结果:
6
去掉注释的结果:
6
Traceback (most recent call last):
File "D:\PythonDemo\test--\cycleTest.py", line 6, in <module>
print(localValur) #去除注释这里会报错,因为localValur是本地变量
NameError: name 'localValur' is not defined
if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的。
for i in range(3):
localValur=i+1
pass
print(i)
print(localValur)
输出结果:
2
3
变量搜索路径是:本地变量->全局变量。
def scopeTest():
var = 6
print(var) #
def innerFunc():
print(f"var:{var}") #注意这里
innerFunc()
var = 5
print(var)
scopeTest()
print(var)
输出结果:
5
6
var:6
5
局部变量总结:
①def函数里面的变量,不能和文件里面的变量共用
②def函数可以嵌套使用,并且内部def函数,可以使用外部def函数的变量。
全局变量 global 关键字
在我们在文件外面定义了一个变量,想通过函数操作是不是就没办法了?
value=100
def scopeTest():
# global value
value +=1
print(value)
scopeTest()
print(value)
没进行声明的时候,是这样的输出结果:
100
Traceback (most recent call last):
File "D:\PythonDemo\test--\cycleTest.py", line 8, in <module>
scopeTest()
File "D:\PythonDemo\test--\cycleTest.py", line 5, in scopeTest
value +=1
UnboundLocalError: local variable 'value' referenced before assignment
去掉注释:
value=100
def scopeTest():
global value
value +=1
print(value)
scopeTest()
print(value)
这个时候,函数里面,修改的结果,也会影响到文件了,输出结果:
100
101
变量生命周期
1. def函数内的变量,在函数结束后就失效了。
2. class类,变量的生命周期
先看案例:
创建一个类,之后把类里面的index值改成有序值
class classTest:
index=0
arr=[]
add=classTest
for i in range(5):
add.index=i
arr.append(add)
for cc in arr:
print(cc.index)
输出结果:
4
4
4
4
4
为什么结果都会变成4?因为这里的变量add的数据类型是一个type类。
print(type(add))
<class 'type'>
数组里面的值是跟着 ‘type’ 对象改变的,add 的生命周期,从声明起就一直没有变化。
正确写法:
class classTest:
index=0
for i in range(5):
add = classTest()
print(type(add))
add.index=i
arr.append(add)
for cc in arr:
print(cc.index)
显示结果:
<class '__main__.classTest'>
<class '__main__.classTest'>
<class '__main__.classTest'>
<class '__main__.classTest'>
<class '__main__.classTest'>
0
1
2
3
4
这个时候,我们的结果就正确了。add的生命周期,在每一次创建的时候,就是一个新变量。
结语
知识点虽然少,但是他的重要性,无可替代,很多看似解决不了的错误,依靠基础知识都可以解决。
很多博主都在推荐功能的使用,我更强调基础的训练。
推荐一本书,确保基础不掉队。
链接:https://pan.baidu.com/s/1YllgwFf3aMbZLHeNyoLkUQ
提取码:9vwh