码迷,mamicode.com
首页 > 其他好文 > 详细

知识点总结

时间:2019-05-05 01:22:38      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:[1]   print   作用域   ror   oca   sig   程序   def   ssi   

全局变量和局部变量

# 全局变量在局部重新赋值会报错,无论是可变数据类型还是不可变数据类型

user = {}

def outer():
    if user:
        print(user)
    user={1:2}
    
# 报错信息:UnboundLocalError: local variable 'user' referenced before assignment (局部变量没有被定义)

#原因:
变量user在函数内部重新定义了,系统不知道user到底是全局变量还是局部变量,如果没有user={1:2},那么最后python会解析user为全局变量

#这种情况不会报错
user = {}

def outer():
    if user:
        print(user)
    user={1:2}


#如果只是修改可变类型的数据,则直接修改的是全局变量的值,user这个变量从始至终都是全局变量的这个user
user={}
def outer():
    if user:
        print(user)
    user[1]=2

#总结:
变量的赋值就会在内存中的栈区和堆区开辟空间存数据,而名称空间是堆区中的一块空间存储变量名和栈区的变量名地址的对应关系,每次赋值名称空间重新产生变量名和变量名的地址的新的对应关系。

函数外的user变量一开始被定义为全局变量,存在全局名称空间中;
如果函数内部没有定义user这个变量,调用user就是调用全局的这个user变量
但是如果函数内部已经定义了局部变量,那就会调用函数内部的这个变量,这个程序会报错,因为调用变量user在定义变量之前,在调用的时候根本没有这个变量,所以才会有报错

局部作用域和全局作用域

# 变量的查找顺序是LEGB,局部变量-内嵌外层局部变量—全局变量-内置变量
#因为python 3的存储结构是堆栈的存储结构,先定义的在名称空间中的对应关系会排在前面,会先被遍历

# 案例1: 结果为2,因为python解释器读到了inner()这个函数内的变量
a=3
def outer():
    a=1
    def inner():
        a=2
        print(a)
    inner()
outer()

#案例2:结果是1,因为inner()这个函数体内部并没有找到a,在它外层的嵌套函数outer()函数体外面找到了a这个变量,所以引用这个变量a的值
a=3
def outer():
    a=1
    def inner():
        print(a)
    inner()
outer()

#案例3: 结果是3,因为inner()这个函数内部以及外部函数outer()都没有找到a这个变量,所以只能找到函数外部的局部变量a,所以引用了局部变量a的值
a=3
def outer():
    def inner():
        print(a)
    inner()
outer()

知识点总结

标签:[1]   print   作用域   ror   oca   sig   程序   def   ssi   

原文地址:https://www.cnblogs.com/cjwnb/p/10810490.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!