无缩进的是全局作用域,有缩进的是局部作用域。
例如:
name = "hello"===========>全局变量
def change_name():
name = "alisa"
print(name)
change_name()=========>结果是:alisa 因为系统会自动调用函数里的name,所以结果是alisa
print(name)===========>结果是: hello
修改全局name
name = "hello"
def change_name():
global name===========>此处代表全局修改name
name = "alisa"
print(name)
change_name()=============>运行函数,结果alisa
print(name)==========>结果是alisa
练习
name = "lhf"
def change_name():
print("我的名字",name)
change_name()======>运行函数结果是:我的名字 lhf
def change_name():
name = "很帅"
print("我的名字",name)
change_name()=========>运行函数结果是:我的名字 很帅
print(name)============>结果是:lhf
def change_name():
global name
name = "很帅"
print("我的名字",name)
change_name()========>运行函数,结果是:我的名字 很帅
print(name)==========>结果是:很帅
如果函数内部没有global关键字,优先读取局部变量,如果局部变量中没有,就会读取全局变量,局部变量能读取全局变量,无法给全局变量重新赋值。但是对于可变对象可以对内部元素进行操作。
如果函数中有global关键字,本质是此变量是全局变量,可以对全局变量进行赋值,读取。
全局变量变量名都大写,局部变量变量名都小写
-不可变对象:字符串,数字,元祖
name = "苹果"====>'苹果'是字符串类型,字符串不可修改
def alisa():
global name======>此处实际是全局变量
name = "香蕉"=======>给全局变量重新赋值
print("我要",name)======>结果是:我要 香蕉
def tom():
print("我要",name)
tom()====>先运行tom(),此时全局变量name 还是苹果所以结果是:我要 苹果
alisa()===>结果是:我要 香蕉
****************************************************
name = "苹果"
def alisa():
global name
name = "香蕉"
print("我要",name)=====》结果是我要 香蕉
def tom():
print("我要",name)
alisa()=====》先运行alisa(),结果是:我要香蕉,并且此时已经对全局变量name重新赋值为香蕉
tom()======》全局变量已重新赋值为香蕉,所以结果是:我要 香蕉
-可变对象:列表,字典等
name = ["苹果","香蕉"]
def alisa():
name.append("橘子")======>由于局部变量中无变量name,所以读取全局变量,并对全局变量的name进行修改
print("我要",name)
def tom():
print("我要",name)
tom()======>规律同上,结果是:我要 ["苹果","香蕉"]
alisa()=====>结果是:我要 ["苹果","香蕉",“橘子”]
************************************************
name = ["苹果","香蕉"]
def alisa():
name.append("橘子")
print("我要",name)
def tom():
print("我要",name)
alisa()=======》结果是:我要 ["苹果","香蕉",“橘子”]
tom()=========》结果是:我要 ["苹果","香蕉",“橘子”]
全局变量大写,局部变量小写,例如:
NAME = ["苹果","香蕉"]
def alisa():
name = "橘子"
global NAME
print("我要",NAME)
alisa()==========>NAME代表全局变量,所以结果是:我要 我要 ['苹果', '香蕉']
************************************
NAME = ["苹果","香蕉"]
def alisa():
name = "橘子"
global NAME
print("我要",name)
alisa()=========>name代表局部变量,所以结果是:我要 橘子
NAME = "海风" 第1步
def huangwei():第3步
name = "黄伟"第4步
print(name)第5步
def liuyang():第7步
name = "刘洋"第8步
print(name)第9步
def nulige():第11步
name = "努力哥"第12步
print(name)
nulige()第10步=====》努力哥
liuyang()第6步=========》刘洋
print(name)第13步======》黄伟 因为局部变量只负责自己的局部变量,其他局部变量不变
huangwei()第2步===========》黄伟
name = "刚娘"
def weihou():
name = "沉着"
def weiweihou():
global name======获取全局变量
name = "冷静"======只有全局变量重新赋值为冷静,上一级变量不变还是沉着
weiweihou()
print(name)
print(name)======刚娘
weihou()=========沉着
print(name)======冷静
*****************************************************************
name = "刚娘"
def weihou():
name = "沉着"
def weiweihou():
nonlocal name======>是指上一级变量
name = "冷静"=======>上一级变量重新赋值为冷静
weiweihou()
print(name)
print(name)=====刚娘
weihou()========冷静
print(name)======刚娘
nonlocal 是指上一级变量
**************************************
count = 10
def num():
print(count)========》首先函数会先加载在内存中,运行函数时,查找不到定义的count
count = 5/count +=1======>count赋值在后。应该移到print() 之前一行。
num()==========>此函数运行会报错。原因如上
修改上述代码:
1)直接删除 count = 5/count +=1
count = 10
def num():
print(count)
num()======》10
2)添加global name 即声明是全局变量,然后可修改
count = 10
def num():
global count
print(count)=====》全局变量,结果是10
count = 5
print(count)=====》此处将全局变量重新赋值为5,所以结果是5
num()