全局变量与局部变量

无缩进的是全局作用域,有缩进的是局部作用域。 

例如:

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()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


posted @ 2021-02-21 16:59  wode110  阅读(153)  评论(0编辑  收藏  举报