函数的作用域
作用域的定义: 就是变量可以使用的范围
1.作用域分类
● 全局作用域
■ 在整个程序运行环境中都可见
■ 全局作用域中的变量称为全局变量
● 局部作用域
■ 在函数,类等内部可见
■ 局部作用域中的变量称为局部变量,其使用范围不能超过其所在的局部作用域.
x =10#全局变量
def fn(): #x 能打印么? 外部变量对内可见,内部定义外部不可见.
print(x)
print(x) # x 能打印么?可见么?
fn()
● 一般来说,外部作用域变量在函数内部可见,可以使用
● 反过来,函数内部的局部变量,不能在函数外部看到
2.函数嵌套
def outer():#首先先进入函数,
def inner():#定义inner函数,所以先打印outer
print('inner')
print('outer')#执行语句
inner()#调用inner()函数
outer()
>>>
outer
inner
内部函数inner不能在外部直接使用,会抛NameError异常,因为它在函数外部不可见。
其实,inner不过就是一个标识符,就是一个函outer内部定义的变量而已。
嵌套结构的作用域
x = 100
def fn():
x+=200 # ??结果会报错 赋值即定义,这里x为局部变量,与全局变量无关,是local变量,x=x+200,但local变量没定义,所以报错.
# y= x+20 # 为什么这样做不报错,但是如果写成 y= x+200,x=50,又会报错.
#这里函数一旦定义,不论内部变量在哪里,都已经被定义为local变量,所以在执行是又会出现没定义就使用的错,故仍然会报错.而且需要使用变量仍然要在赋值前.
print(x)
print(x)
fn()
print(x)
总结上面函数错误:
- 定义的函数,内部使用了赋值即定义,因此在函数执行时,会提示变量错误,例如 x+=10 ,x=x+10 ,还未定义怎么调用?
- 赋值即定义的位置不能在需要执行代码后,如:print(x),x=200,因为这里的x是local变量,且赋值在后,使用在前.所以仍然是未定义.还是报错
注意以上两点!!!
全局变量
global使用原则
● 外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是
为了封装,尽量与外界隔离
● 如果函数需要使用外部全局变量,请尽量使用函数的形参定义,并在调用传实参解决
● 一句话:不用global。学习它就是为了深入理解变量作用域
global 语句 声明变量 将当前函数的变量申明为全局变量
y=[]
def inc_one(x):# x就是标识符,就是变量,就是本地变量
x.append(1)
in_one(y)
in_one(y)
in_one(y)
print(y)
c= 100
def inc():
global c
return c+1
inc()
inc()
print(c)
# ~~~~~~~~~~~~~~~~~~~~~~ 比较上下两个函数,使用传参进行引用,不到万不得已不使用全局变量.注意,慎重.
c= 100
def