Python变量作用域

if __name__ =="__main__":
#变量作用域

#变量作用域就是变量的可访问范围,也称为命名空间。
#在第一次给变量赋值时,Python创建变量。
#第一次给变量赋值的位置决定了变量的作用域。

#有哪些作用域:
#一个程序通常包含了变量、函数和其他的各种语句,变量和函数涉及可访问范围。
#一个程序中的变量和函数要么是在当前文件中定义要么是Python提前预定义好的。
#函数和程序文件啊划分了不同的作用域。在同一个作用域中哦,变量名是唯一的。
#在不用作用域中,相同的变量名也表示了不同的变量!!!!
#Python作用域可分为:
#内置作用域:最顶层,包含了Python各种预定义变量和函数的作用域
#文件作用域:程序文件(也称为模块文件)的内部为文件作用域
#函数嵌套作用域:包含了其他函数定义的函数的内部
#本地作用域:不包含其他函数定义的函数的内部称为本地作用域。
#函数内部通过赋值创建变量,函数参数都属于本地作用域

#作用域内部可以使用作用域外部的变量和函数
#作用域内部的变量和函数不能在作用域外部使用

#文件作用域
a=10 #a是全局变量
def add(b): #参数b是函数add内的本地变量
c = a + b #c是函数add内的本地变量,a是函数外部的全局变量
return c
print(add(5)) #调用函数
#该程序在运行过程中,会产生abc、和add4个变量名
#aadd属于文件作用域内的全局变量,bc是函数add内部的本地变量
#另外还使用了print这个内置函数

#函数内部的本地变量,在调用函数时(函数执行期间)才会被创建。
#函数执行结束,本地变量也会从内存删除。
#def是一条可执行语句,它创建了一个函数对象赋值给函数名变量。

#作用域外的变量与作用域内的变量名称相同时,遵循本地优先原则,
#此时外部作用域被屏蔽——称为作用域隔离原则。
a = 10 #赋值创建全局变量a
def show():
a = 100 #赋值创建本地变量a
print("in show():a=",a)
show() #本地变量屏蔽了全局变量
print("a=",a)

#
'''
a=10
def show():
print('a=',a)
a=100
print('a=',a)
show()
'''
#在函数show()中先打印a的值,因为后面有赋值语句
#Python将函数内部的a都作为本地变量,所以在调用函数时会出现错误
'''
UnboundLocalError: local variable 'a' referenced before assignment
'''
#提示本地变量a使用之前没有赋值!

#global 语句
print("global语句:")
a = 10
def show():
global a
print('a=',a)
a=100
print('a=',a)
show()
#内部使用了global语句进行声明,所以代码中使用到的a都是全局变量a.
#软工角度:在函数内部使用global语句使得在函数内部可以修改全局变量的值,
#这种方式降低了软件的质量,使程序的调试、维护变得困难,
#因此不提倡在函数中修改全局变量或函数参中的可修改变量

#nonlocal 语句
#作用域隔离原则同样适用于函数内部的嵌套函数。
#在嵌套函数内试用与上层函数本地变量同名的变量时,
#若该变量没有赋值,则该变量就是上层函数的本地变量。
def test():
b=10 #创建test函数的本地变量b
def show():
print('in show(),b=',b) #使用test函数的本地变量b
show()
print('in test(),b=',b) #使用test函数的本地变量b
test()

#
def test():
b=10 #创建test函数的本地变量b
def show():
b=100 #创建show函数的本地变量b
print('in show(),b=',b) #使用show函数的本地变量b
show()
print('in test(),b=',b) #使用test函数的本地变量b
test()
#可以看出,在嵌套函数内为变量赋值时,即使有同名的外部变量,也默认创建一个本地变量
#如果要在嵌套函数内部修改外部本地变量,可以使用nonlocal语句
#nonlocal语句与global语句类似,它声明变量是外部的本地变量

def test():
a=15 #创建test函数的本地变量a
def show():
nonlocal a #声明atest函数的本地变量a
a=111 #修改test函数的本地变量a
print('in show(),a=',a) #使用test函数的本地变量a
show()
print('in test(),a=',a) #使用test函数的本地变量a
test()


posted @   轻拥一世温柔  阅读(526)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today! Adopt one today!
点击右上角即可分享
微信分享提示