大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层……
即:当前作用域局部变量->外层作用域变量->再外层作用域变量->……->当前模块全局变量->pyhton内置变量
global:全局变量
nonlocal:外层嵌套函数的变量
使用总结:
1、局部作用域改变全局变量用global, global同时还可以定义新的全局变量
2、内层函数改变外层函数变量用nonlocal, nonlocal不能定义新的外层函数变量,只能改变已有的外层函数变量
同时nonlocal不能改变全局变量
一、没有关键字
a = 10 # a1 当前模块全局变量
def outer():
a = 9 # a2 当前outter作用域局部变量
def inner():
a = 8 # a3 当前inner作用域局部变量
print(a) # a3 8, 在inner的局部作用域中找到了a3
inner() # inner()函数结束,a3作为inner局部变量被释放
print(a) # a2 9,在outer局部作用域中找到a2
outer() # outer()函数结束,a2作为outer局部变量被释放
print(a) # a1 10, 在当前模块全局作用域中找到了a1
a1、a2、a3分别是不同变量
二、global关键字:声明此变量为全局变量
1、用于在局部作用域中修改全局变量
a = 10 # a1 当前模块全局变量
def outer():
a = 9 # a2 当前outter作用域局部变量
def inner():
global a
a = 8 # a3 既是全局变量a1,又是inner局部变量
print(a) # a3 8,在inner的局部作用域中找到了a3
inner() # inner()函数结束,a3作为全局变量被保留下来成为a1
print(a) # a2 9,在outer局部作用域中找到a2
outer() # outer()函数结束,a2作为outer局部变量被释放
print(a) # a1 8, 在当前模块全局作用域中找到了a1
a1、a3是同一个变量,都是全局变量a
2、若没有在外部定义全局变量a,在局部作用域中加global关键字依然能声明一个变量为全局变量
def outer():
a = 9 # a2 当前outter作用域局部变量
def inner():
global a
a = 8 # a3 既是inner局部变量,又是模块全局变量
print(a) # a3 8 在inner的局部作用域中找到了a3
inner() # inner()函数结束,a3作为全局变量被保留下来
print(a) # a2 9,在outer局部作用域中找到a2
outer() # outer()函数结束,a2作为outer局部变量被释放
print(a) # a3 8在当前模块全局作用域中找到了a3
3、outer()没有局部变量a,则往上使用全局变量a
def outer():
def inner():
global a
a = 8 # a3 既是inner局部变量,又是模块全局变量
print(a) # a3 8,在inner的局部作用域中找到了a3
inner() # inner()函数结束,a3作为inner局部变量被释放
print(a) # a3 8,在outer局部作用域中没找到a,往上在全局作用域中找到了全局变量a3
outer() # outer()函数结束,a2作为outer局部变量被释放
print(a) # a3 8,在当前模块全局作用域中找到了a3
三、nonlocal关键字:声明此变量与外层同名变量为相同变量
1、用于在内层函数中改变外层函数变量
a = 10 # a1 当前模块全局变量
def outer():
a = 9 # a2 outer局部变量
def inner():
nonlocal a
a = 8 # a3 既是inner局部变量,又是外层outer局部变量
print(a) # a3 8,在inner的局部作用域中找到了a3
inner() # inner()函数结束,a3作为外层变量(outer局部变量)被保留成为a2
print(a) # a2 8,在outer局部作用域中找到a2(在inner中被改变)
outer() # outer()函数结束,a2作为outer局部变量被释放
print(a) # a1 10,在当前模块全局作用域中找到了a1
a2、a3为同一变量
2、注意:如果在外层没有找到变量a,则会继续在再外层寻找,直到全局作用域的下一层为止(看第3点)
a = 10 # a1 当前模块全局变量
def outer2():
a = 9 # a2 outer2作用域局部变量
print(a) # a2 9,还未被a3改变
def outer1():
print(a) # a2 9,在outer1中没找到局部变量a,则寻找外层(outer2)变量a2(还未被a3改变)
def inner():
nonlocal a
a = 0 # a3 既是inner局部变量,又是再外层outer2作用域变量
print(a) # a3 0, 找到inner局部变量a3
inner() # inner()函数结束,a3作为外层变量(outer2局部变量)被保留成为a2
print(a) # a2 0,在outer1中没找到局部变量a,则寻找外层(outer2)变量a2(被a3改变)
outer1()
print(a) # a2 0, 在outer1中找到outer1局部变量a2(被a3改变)
outer2()
print(a) # a1 10,在当前模块全局作用域中找到了a1
3、全局变量不是外层变量,不被nonlocal寻找
a = 10 # a1 当前模块全局变量
def outer():
def inner():
nonlocal a # 在当前作用域外层即outer局部作用域中没找到outer局部变量a,outer外层为全局作用域,nonlocal不继续寻找,报错
a = 8
print(a)
inner()
print(a)
outer()
print(a) # a1 10,在当前模块全局作用域中找到了a1
报错:
a = 10 # a1 当前模块全局变量
def outer2():
nonlocal a # outer2下一层为全局作用域,nonlocal不寻找全局变量,报错
a = 8
outer2()
print(a) # a1 10,在当前模块全局作用域中找到了a1
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196694.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...