❤️Python面向对象保姆式教学❤️,新手速成精英之路!

前言

最近,我在群里答疑的时候,经常碰到,小伙伴,再变量,缩进,参数,方面使用错误,导致程序运行不来。

今天,打算自己写一篇。
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的生命周期,在每一次创建的时候,就是一个新变量。

结语

知识点虽然少,但是他的重要性,无可替代,很多看似解决不了的错误,依靠基础知识都可以解决。

很多博主都在推荐功能的使用,我更强调基础的训练。


推荐一本书,确保基础不掉队。

❤️Python面向对象保姆式教学❤️,新手速成精英之路!_第1张图片
链接:https://pan.baidu.com/s/1YllgwFf3aMbZLHeNyoLkUQ
提取码:9vwh

❤️Python面向对象保姆式教学❤️,新手速成精英之路!_第2张图片

你可能感兴趣的:(经验,基础,python,pycharm)