312-关键字global和nonlocal
global:全局变量,代表从这行代码开始,使用的变量都是全局中的变量
只能使用在函数里面
num=10
def func():
#尝试在局部作用域中修改全局变量
global num
num = 100
func()
print(num)
global只能修改全局变量
num=1
def outer():
#局部变量
num = 10
def inner():
global num
num = 100
inner()
print(num) # 输出10
outer()
print(num) # 输出100
nonlocal:离它最近的外层的局部变量
在内层函数里修改离他最近的外层局部变量
num=1
def outer():
#局部变量
num = 10
def inner():
nonlocal num
num = 100
inner()
print(num) # 输出100
outer()
print(num) # 输出1
应用的栗子
"""
假设你是一名网站开发者,你需要设计一个函数 login_counter(),用于统计用户登录的次数和最近一次登录的时间。
要求:
login_counter() 返回一个闭包 login()。
每次调用 login(),它将累加用户登录的次数,并记录最近一次登录的时间。
需要返回一个字典,包含累计的登录次数(total_count)和最近一次登录的时间(last_login_time)。
设计思路:
在 login_counter() 函数外部定义一个变量 count,用于记录累计的登录次数。
在 login_counter() 函数内部定义一个变量 last_login,用于记录最近一次登录的时间戳。
在 login() 函数内部更新 count 和 last_login 的值,并返回字典形式的结果。
"""
import time
count = 0
def login_counter():
last_login = None
def login():
nonlocal last_login
global count # 这里count也可以写成nonlocal
count += 1
last_login = time.time()
return {"total_count": count, "last_login_time": last_login}
return login
# 调用示例
login_counter = login_counter()
print(login_counter())
print(login_counter())