前言
在第一篇文章中,简单介绍过变量,随着学习的深入,我们知道列表、字典、都有嵌套,再到流程控制语句的嵌套,其实函数也会有嵌套。
----------->
那么,嵌套域变量有什么关系呢?
下面一步步来学习~
变量的作用域
变量的作用域,即变量的生命周期
在python中,变量(LEGB )遵循的规则:local ---> enclosing ---> global----> builtin
即:
嵌套作用域(local ):函数内嵌套的另一个函数的内部的变量,可以在这个内部函数中访问。
局部作用域(enclosing):在函数内部定义的变量,只能在该函数内部访问。
全局作用域(global):在模块级别定义的变量,可以在模块内的任何位置访问。
内建作用域(builtin):python内置的一些变量和函数,如
len、sum
等,可以直接访问
变量嵌套&局部变量
变量嵌套&局部变量示例代码如下:
属于一个函数嵌套一个函数:
" bar()"是"foo()"的嵌套子函数。
如果不写"bar()"的调用,则只会执行"foo()"调用的打印,即只有一个打印结果。
"bar()"、"foo()"都进行调用,执行打印则会有2个结果。
def foo():
print("foo...")
def bar(): #函数再嵌套函数
print("bar...")
bar()
#food调用时,会加载bar(),同时执行foo()
foo()
#输出:
foo...
bar...
不同作用域的变量效果
全局变量、局部变量、函数内部变量的引用:
x = 100 #全局变量
def foo():
x = 20 #局部变量
print("foo的x:",x)
def bar(): #函数再嵌套函数
x = 5 #嵌套内部变量
print("bar的x:",x)
bar()
#food调用时,会加载bar(),同时执行foo()
foo()
print(x)
#输出:
foo的x: 20
bar的x: 5
100
同样:
如果嵌套内部变量被注释,则找的是局部变量
所以下面代码的的执行结果中,"foo的x"和"bar的x"都是20
x = 100 #全局变量
def foo():
x = 20 #局部变量
print("foo的x:",x)
def bar(): #函数再嵌套函数
# x = 5 #嵌套内部变量
print("bar的x:",x)
bar()
#food调用时,会加载bar(),同时执行foo()
foo()
print(x)
#输出:
foo的x: 20
bar的x: 20
100
如果局部变量,也被注释了,则找的是全局变量:
"foo的x"和"bar的x"和"x"的打印结果都是100
x = 100 #全局变量
def foo():
# x = 20 #局部变量
print("foo的x:",x)
def bar(): #函数再嵌套函数
# x = 5 #嵌套内部变量
print("bar的x:",x)
bar()
#food调用时,会加载bar(),同时执行foo()
foo()
print(x)
#输出:
foo的x: 100
bar的x: 100
100
如果全局变量也被注释了,则会报错:
执行代码时候,python会去找内部函数,有没有一个变量叫x的
但是找不到一个变量叫x的,所以报错
找内部函数:
把变量名称改成"sum",这次没有报错,因为sum是python的内部函数
同理:
一个全局变量,两个函数,一个内部变量时
"foo()"调用时,只会在"foo()"的内部找,有没有内部变量,内部找不到,则会找全局变量
x = 100 #全局变量
def foo():
print("foo的x:",x)
def bar():
x = 10 #内部变量
print("bar的x:",x)
foo()
bar()
#输出:
foo的x: 100
bar的x: 10
变量的声明
内部函数修改全局变量值
内部变量进行赋值后,再查看全局变量,仍没有被修改成功
原因还是因为,内部变量与局部变量的关系
age = 35 #全局变量
def update_age():
age = 18 #内部变量赋值
print("age:",age)
update_age()
print(age)
#输出:
age: 18
35
但是,如果我就想把局部函数里修改全局变量,怎么办呢?
例如:我就想在内部函数里,将局部变量age修改为18,只需要做一个global声明
age = 35 #全局变量
def update_age():
global age
age = 18 #内部变量赋值
print("age:",age)
update_age()
print(age)
#输出:
age: 18
18
内部函数调用全局变量
当我定义了sub()函数,但是函数内部没有对x赋值时,执行函数调用会报错
因为函数内部找不到x
如果我就想用全局变量的x呢?
也是一样,只需要在函数内部global声明即可: