全局变量和局部变量

局部变量:在子程序中定义的变量称为局部变量

全局变量:在程序的一开始定义的变量称为全局变量。

android 将一个局部变量提升为全局变量快捷键 全局变量改为局部变量_全局变量

不同之处:全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

#当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
test_name='susu'

def test():
    test_name='sugh'
    print("猜猜我是谁-%s"%test_name)  #输出的是 猜猜我是谁-sugh

test()
print("我是%s"%test_name) #输出的是  我是susu
#全局变量是不可变的数据类型,函数不可以直接对全局变量内部直接进行修改;修改则会直接报错
test_name='susu'

def test():
    print("猜猜我是谁-%s"%test_name)  #输出的是 猜猜我是谁-susu --》可读取全部变量
    #test_name = 'sugh'  #不可对全局变量进行赋值操作
    #print("修改后的全部变量,%s"%test_name) #报错  UnboundLocalError: local variable 'test_name' referenced before assignment

test()
print("我是%s"%test_name) #输出的是  我是susu

#全局变量是不可变的数据类型,用global进行声明,则可以操作
test_name='susu' #全局变量

def test():
    global test_name   #声明test_name是全局变量  global
    test_name = 'Nosusu' #修改test_name 全局变量的值
    print("猜猜我是谁-%s"%test_name)  #输出的是  猜猜我是谁-Nosusu

test()
print("我是%s"%test_name) #输出的是  我是Nosusu

#全局变量是可变的数据类型,函数可以对全局变量内部直接进行修改
test_namelist=['susu','jack','petter']
def test():
    print("猜猜我是谁-%s"%test_namelist)  #输出 猜猜我是谁-['susu', 'jack', 'petter']
    test_namelist[1] = 'sugh'
    print("修改后的全部变量,%s"%test_namelist) #输出 修改后的全部变量,['susu', 'sugh', 'petter']

test()
print("我是%s"%test_namelist)  #我是['susu', 'sugh', 'petter']
总结:
函数中无global关键字
1、全局变量是不可变的类型,函数优先读取局部变量,能读全局变量,无法对全局变量重新赋值操作
2、全局变量是可变类型,函数可以对全局变量进行操作

函数中有global关键字
1、变量本质就是全局变量,可读取全局变量,也可操作全局变量
===========错误实例=================
test_namelist=['susu','jack','petter']
def test():
    test_namelist = 1
    global  test_namelist
    print("修改后的全部变量,%s"%test_namelist) #会报错,SyntaxError: name 'test_namelist' is assigned to before global declaration
test()

 

总结
1、全部变量 变量名建议大写
2、局部变量 变量名建议小写
NAME='小红'

def xiaolu():
    name='小路'
    print(name)
    def xiaohuang():
        name="小黄"
        print(name)
        def xiaozi():
            name='小紫色'
            print(name)
            def xiaobai():
                name='小白'
                print(name) #输出的是 小白
            xiaobai()
            print("-----",name) #输出的是 小紫色
        xiaozi()
        print("-----", name) #输出的是 小黄
    xiaohuang()
    print("-----", name) #输出的是 小路
    
xiaolu()
官网的nonlocal的用法:
1、非局部声明变量指代的已有标识符是最近外面函数的已声明变量,但是不包括全局变量。这个是很重要的,因为绑定的默认行为是首先搜索本地命名空间。nonlocal声明的变量只对局部起作用,离开封装函数,那么该变量就无效。

2、非局部声明不像全局声明,我们必须在封装函数前面事先声明该变量

3、非局部声明不能与局部范围的声明冲突

 

 

#嵌套函数,各有各的变量名
name = '小红'
def xiaolu():
    name = '小路'
    def xiaohuang():
        name = "小黄"
        print(name)
    xiaohuang()
    print("-----", name)

print(name)
xiaolu()
print(name)
"""
执行结果
小红
小黄
----- 小路
小红


"""
#嵌套函数,引用global 关键字
name = '小红'

def xiaolu():
    name = '小路'
    def xiaohuang():
        global name
        name = "小黄"
    xiaohuang()
    print("-----", name)  # 输出的是 小路

print(name) #输出小红
xiaolu()
print(name) #输出 小黄
"""
执行结果:
小红
----- 小路
小黄
"""
============nonlocal===============
name = '小红'

def xiaolu():
    name = '小路'
    def xiaohuang():
        nonlocal name  #nonlocal ,指定上一级变量
        name = "小黄"
    xiaohuang()
    print("-----", name)  # 输出的是 小黄

print(name) #输出小红
xiaolu()
print(name) #输出 小黄
"""
执行结果:
小红
----- 小黄
小黄
"""

name = '小红'
def xiaolu():
    #name = '小路'  #不事先声明,那么函数xiaohuang中的 nonlocal 会报错
    def xiaohuang():
        nonlocal name  #SyntaxError: no binding for nonlocal 'name' found
        name = "小黄"
    xiaohuang()
    print("-----", name)  

print(name) 
xiaolu()
print(name)