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