全局变量和局部变量
局部变量:在子程序中定义的变量称为局部变量
全局变量:在程序的一开始定义的变量称为全局变量。
不同之处:全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
#当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
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)