最近,我在群里答疑的时候,经常碰到,小伙伴,再变量,缩进,参数,方面使用错误,导致程序运行不来。
今天,打算自己写一篇。
Python 变量作用域,和生命周期。
彻底弄懂变量该怎么使用。
变量的使用,有作用域区别,也有生命周期的区别。
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函数的变量。
在我们在文件外面定义了一个变量,想通过函数操作是不是就没办法了?
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
先看案例:
创建一个类,之后把类里面的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