全局变量和局部变量
局部变量:
定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
局部变量只能在函数内部使用
局部变量在函数调用时才能被创建,在函数调用之后会自动销毁
全局变量
定义在函数外部,模块内部的变量称为全局变量
全局变量所有函数都可以直接访问(但函数内部不能将其赋值)
示例:
# 此示例示意全局变量和局部变量
a = 100 # 全局变量
b = 200 # 全局变量
def fx(c): # c是局部变量
d = 400 # d是局部变量
print(a, b, c, d)
fx(300)
print(a, b)
说明:
1. 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个模块范围内访问
2. 在函数内部赋值语句不会对全局变量造成影响
示例:
L = []
def input_number():
L2 = []
while True:
n = int(input("请输入正整数")) # 1 2 3 4
if n < 0:
break
L2.append(n)
L = L2
input_number()
print(L)
globals() / locals() 函数
globals() 返回当前全局作用域内变量的字典
locals() 返回当前局部作用内变量的字典
示例:
def fn_outter():
print("fn_outter() 被调用")
def fn_inner():
print("fn_inner 被调用")
fn_inner() # 调用嵌套函数fn_nner
fn_inner() # 第二次调用
print('fn_outter() 调用结束')
fn_outter() # 调用外层函数
函数变量:
函数名是变量,它在创建函数时绑定一个函数
示例:
# 此示例示意函数名fn是变量.它绑定一个函数对象
def fn():
print("hello world!")
f1 = fn
print(fn) # <function fn at 0x7f0df513bf28>
print(f1) # <function fn at 0x7f0df513bf28>
print(f1()) # None
def f1():
print("函数f1被调用")
def f2():
print('函数f2被调用')
f1, f2 = f2, f1
f1() # f2被调用
f2() # f1被调用
一个函数可以作为另一个函数的实参传递
示例:
# 此示例示意一个函数可以作为别一个函数的实参传入另一个函数中
def f1():
print("hello f1")
def f2():
print('hello f2')
def fx(fn):
print(fn) # < function f1 at 0xXXXXXXX>
fn() # 调用fn绑定的函数
fx(f1) # 请问是如何执行的?
fx(f2)
看懂下面的代码在干什么:
def myinput(fn):
L = [1, 3, 5, 7, 9]
return fn(L)
print(myinput(max)) # 9
print(myinput(min)) # 1
print(myinput(sum)) # 25
函数可以返回另一个函数
示例:
def get_function():
s = input("请输入您要做的操作: ")
if s == '求最大':
return max
elif s == '求最小':
return min
elif s == '求和':
return sum
L = [2, 4, 6, 8, 10]
f = get_function() # 让get_function返回给我们一个函数
print(f(L))
python3的四个作用域
作用域也叫名字空间,是访问变量时查找变量名的范围空间
python的四个作用域 LEGB
作用域 英文解释 英文简写
局部作用域(函数内) Local(function) L
外部嵌套函数作用域 Enclosing function locals E
函数定义所在模块作用域 Global(module) G
python内置模块的作用域 Builtin(Python) B
示例:
v = 100 # 全局
def fun1():
v = 200 # 外部嵌套函数作用域
print("fun1.v=", v)
def fun2():
v = 300 # 局作用域
print('fun2.v=', v)
fun2() # 调用fun2
fun1()
print("全局变量v=", v)
变量名查找规则:
在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内的变量,之后是全局变量,最后是内建作用域内的变量
即: L ---> E ---> G ----> B
在默认情况下,变量名赋值会在当前作用域内创建变量和修改变量
global 语句
作用:
告诉解释执行器,global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域,也称作全局作用域
全局声明 global 将赋值变量映射到模块文件内部的作用域
语法:
global 变量名1, 变量名2, ...
示例:
v = 100
def fn():
global v # 告诉解释执行器python3, v是全局变量,不是局部变量
v = 200
fn()
print('v=', v) # 200
说明:
1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)
2. 全局变量在函数内部不经过声明就可以直接访问
3.不能先声明局部变量,再用global声明为全局变量,此做法不附合规则
4. global变量列表里的变量名不能出现在函数的形参列表里
nonlocal语句
作用:
告诉解释执行器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
语法:
nonlocal 变量名1, 变量名2, ....
示例:
v = 100
def f1():
v = 200
print("f1.v=", v)
def f2():
nonlocal v
v = 300
print("f2.v=", v)
f2()
print("调用f2()后的f1.v = ", v)
f1()
print("全局的v=", v)
说明:
1. nonlocal 语句只能在被嵌套函数的内部进行使用
2. 对nonlocal变量进行赋值操作,将对外部嵌套函数作用域内的变量进行操作
3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层变量进行操作
4. nonlocal语句的变量列表里的变量名,不能出现在此函数形参列表中
今天没有作业~吼吼吼~
想要看更多的课程请微信关注SkrEric的编程课堂