亲宝软件园·资讯

展开

Python - 变量的作用域

小菠萝测试笔记 人气:0

变量作用域

  • Python能够改变变量作用域的代码段是 def 、 class 、 lamda. 
  • if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的
  • 变量搜索路径是:局部变量->全局变量

 

局部变量vs全局变量

局部变量:在函数内部,类内部,lamda.的变量,它的作用域仅在函数、类、lamda里面

全局变量:在当前py文件都生效的变量

 

global的作用

让局部变量变成全局变量

def tests():
    global vars
    vars = 6

tests()
print(vars)

执行结果

6

切记

先global声明一个变量,再给这个变量赋值,不能直接 global vars = 6 ,会报错哦!!

 

if/elif/else、try/except/finally、for/while

# while
while True:
    var = 100
    break
print(var)

# try except
try:
    var = 111
    raise Exception
except:
    print(var)

print(var)

# if
if True:
    var = 222

print(var)

# elif
if False:
    pass
elif True:
    var = 333
print(var)

# else
if False:
    pass
else:
    var = 444
print(var)

# for
for i in range(0, 1):
    var = 555

print(var)

执行结果

100
111
111
222
333
444
555

 

变量搜索路径是:局部变量->全局变量

def test():
    var = 6
    print(var)  #

var = 5
print(var)
test()
print(var)

执行结果

5
6
5

 

Python的LEGB规则

  • L-Local(function);函数内的变量
  • E-Enclosing function locals;外部嵌套函数的变量
  • G-Global(module);函数定义所在模块的变量
  • B-Builtin(Python);Python内置模块的名字空间

这是我们代码找变量的顺序,倘若最后一个python内置模块也没有找到的话就会报错了

听着很抽象。。什么意思呢。。来看代码

# Python内置模块的变量
x = int(0.22)

# 全局变量
x = 1


def foo():
    # 外部函数变量
    x = 2

    def innerfoo():
        # 局部变量
        x = 3
        print('local ', x)

    innerfoo()
    print('enclosing function locals ', x)


foo()
print('global ', x)

执行结果

local  3
enclosing function locals  2
global  1

 

当我们改动下代码,把局部变量注释

# Python内置模块的变量
x = int(0.22)

# 全局变量
x = 1


def foo():
    # 外部函数变量
    x = 2

    def innerfoo():
        # 局部变量
        # x = 3   ##### 被注释掉了
        print('local ', x)

    innerfoo()
    print('enclosing function locals ', x)


foo()
print('global ', x)

执行结果

local  2
enclosing function locals  2
global  1

 

现在把外部函数变量也注释掉

# Python内置模块的变量
x = int(0.22)

# 全局变量
x = 1


def foo():
    # 外部函数变量
    # x = 2 ###注释

    def innerfoo():
        # 局部变量
        # x = 3 ###注释
        print('local ', x)

    innerfoo()
    print('enclosing function locals ', x)


foo()
print('global ', x)

执行结果

local  1
enclosing function locals  1
global  1

 

现在把全局变量也注释掉

# Python内置模块的变量
x = int(0.22)

# 全局变量
# x = 1


def foo():
    # 外部函数变量
    # x = 2

    def innerfoo():
        # 局部变量
        #x = 3
        print('local ', x)

    innerfoo()
    print('enclosing function locals ', x)


foo()
print('global ', x)

执行结果

local  0
enclosing function locals  0
global  0

 

注意点

其实一般不会用到外部嵌套函数的作用域,所以只要记得Python内置模块作用域 > 全局变量作用域 > 局部变量作用域就好了

 

 

加载全部内容

相关教程
猜你喜欢
用户评论