全局变量与局部变量
在程序的开始定义的变量称为全局变量,全局变量作用是整个程序
在子程序中定义的变量称为局部变量,局部变量作用是定义该变量的子程序。
当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
例如:
变量下班在地铁上,想着今天早上没用打开公司的门而烦恼,想的头都要炸了,赋值给变量出个具体什么主意,我也不知道,第二天,变量打开了公司的门,因为昨天晚上变量在网上订购一把万能钥匙- >(全局变量)
?变量拿着自己家门钥匙,去开公司的门它能开开吗肯定不能,有局限性,变量家门钥匙只能打开自家的门- >(局部变量)
num = '全局'#定义全局变量
def func():
num = '局部'# 定义局部变量
print(num)
# 执行函数func
func()
# 命名规则:
# 全局变量——>变量名要大写
# 局部变量——>变量名要小写
# 1.函数的无global关键字,优先读取局部变量,子程序没有定义局部变量,能读取全局变量,无法重新赋值, 但是对于可变类型,可以对内部元素进行操作
# 有声明局部变量
result = ['全局', '局部']
def result_text():
result = '变量'
print(result)
result_text()
# 无声明局部变量
# 补充:
# 列表类中方法都可以用
NAME = ['可有','可无']
def NAME_test():
NAME.append('可变')
print(NAME)
NAME_test()
# 2.函数中有global关键字,变量本质上就是全局变量,可读取可赋值
# 有global关键字,无同名变量
# 有声明局部变量
func = ['无global', 'global']
def func_result():
global func
func = '有关键字'
print(func)
func_result()
# 错误示范:
# 注意如果要声明全局变量时一定要变量的上方定义global关键字
func = ['无global', 'global']
def func_result():
func = '有关键字'
global func
print(func)
# func_result()
# 无声明局部变量
func = ['无global', 'global']
def func_result():
global func
name = ['有关键字']
func.append(name)
print(func)
func_result()
蟒作用域大概分为4类(非原创):
L:local,局部作用域,即函数中定义的变量;
E:封闭,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:全球,全局变量,就是模块级别定义的变量;
B:内置,系统固定模块里面的变量,比如int,bytearray等。
搜索变量的优先级顺序依次是:局部作用域>外层作用域>当前模块中的全局> python内置作用域,也就是LEGB。
x = int(123)#内建作用域 B
NAME = '嵌套' #全局作用域G
def outr():
o_ou = 1#嵌套作用域E
def info():
infc = 3 #局部作用域L
作用是怎么产生的?
产生新的作用域:模块(模块),类(类)以及函数(DEF,拉姆达)
不产生作用域:如果试试,对等
globar与外地运用
1.在全局作用域可以这样使用
x = 1
def outfx():
global x # global改变了G区变量
x = '2'
print(x)
outfx()
print(x)
2.当变量在父作用域的时候,必须这样使用
def outfx():
x = 1
def info():
nonlocal x # nonlocal改变了E区变量
x = 2
print(x)
info()
print(x)
outfx()
在函数内定义的函数,不能在外面调用
def result1():
def result2():
def result3():
pass
print("result1")
result2()
result1()
# 错误示例:
def result1():
def result2():
def result3():
pass
print("result1")
result2()
result2()
NameError: name 'result2' is not defined# 报错
前后引用,一定要注意函数要先定义,后使用
def bar():
print('from bar')
def foo():
print('from foo')
bar()
foo()
# 错误示例:
def foo():
print("from foo")
bar()
foo()
def bar():
print("from bar")
# 输出结果:
NameError: name 'bar' is not defined # 报错,bar没有定义