嵌套与作用域

全局变量与局部变量

     在程序的开始定义的变量称为全局变量,全局变量作用是整个程序

     在子程序中定义的变量称为局部变量,局部变量作用是定义该变量的子程序
     当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

例如:

    变量下班在地铁上,想着今天早上没用打开公司的门而烦恼,想的头都要炸了,赋值给变量出个具体什么主意,我也不知道,第二天,变量打开了公司的门,因为昨天晚上变量在网上订购一把万能钥匙- >(全局变量)
    ?变量拿着自己家门钥匙,去开公司的门它能开开吗肯定不能,有局限性,变量家门钥匙只能打开自家的门- >(局部变量)

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没有定义

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值