python 全局变量和局部变量

一、全局变量

在一个文件顶部定义的变量可以供该文件中任意函数调用

1.定义全局变量

name = '全局变量' #定义全局变量
def name():
    pass
name()

2.调用全局变量

name = '全局变量' #定义全局变量
def name():
    print('name()',name)#调用全局变量
name()

3.修改全局变量

name = '123' #定义全局变量
def change_name():
    #name = '213' #直接进行修改的话,其实是修改的名为name的局部变量
    gobal name #声明此处的name是全局变量
    name = '213' #修改全局变量
    print(name)
change_name()
print(name)

二、局部变量

局部变量是在某个函数中声明的仅限于当前函数使用的变量。

def chang_name():
    name = "name" #定义局部变量
    name = 'lastname' #修改局部变量
    print('name()',name) #调用局部变量
print('py',name) #会报错,name仅限于chang_name函数使用。

三、global关键词

如果函数无global关键词:

1.有声明局部变量

NAME = ["a" , 'b']
def test1():
    NAME = 'c'
    print(NAME) #使用的是局部变量
test1()

2.无声明局部变量

NAME = ["a" , 'b']
def test2():
    NAME.append('c') #无法修改全局变量,但若全局变量是列表等可更改类型,可对其元素进行修改。
    print(NAME) #使用的是全局变量
test2()

如果函数有global关键词

1.有声明局部变量

def test3():#存在多个同名变量,会报错。如果需要使用全局变量,将其写在前面。
    NAME = 'c'
    global NAME
    print(NAME)
test3()

2.无声明局部变量

NAME = ["a" , 'b']
def test4():
    global NAME
    NAME = [1 , 2] #可直接对全局变量进行修改,变量实质上就是全局变量
    print(NAME)
test4()

为避免全局变量与局部变量混淆,应将全局变量全大些(NAME),局部变量全小写(name)。

未声明全局变量:

def a():
    global  name
    name = 1
print(name) #错误:name 'name' is not defined global无法将不为全局变量的局部变量提升至全局变量

四、nonlocal关键词

nonlocal在第一层函数内:

name = 'x'
def a():
    global name #错误:no binding for nonlocal 'name' found
    name = 'a'
    print(name) 
print(name) 
a() 
print(name)
nonlocal无法获取全局变量。

四、函数的嵌套

函数在不被调用的时候只加载不执行。

基本嵌套的执行流程:

def a(): #
    name = 'a' #第二步
    print(name) #第三步

    def b():
        name = "b" #第五步
        print(name) #第六步

        def c():
            name = 'c' #第九步
            print(name) #第十部
        print(name) #第七步
        c() #第八步
    b() #第四步
    print(name) #第十一步

a() #第一步

有global关键词修饰的:

name = 'x' #第一步
def a():
    name = 'a' #第四步
    def b():
        global name #第六步,获取全局变量 name(x)
        name = "b" #第七步,修改全局变量name的值x为b
    b() #第五步
    print(name) #第八步输出a的局部变量 a
print(name) #第二步:输出x
a() #第三步
print(name)#第九步:输出修改后的全局变量 b

有nonlocal关键词修饰的:

name = 'x' #第一步
def a():
    name = 'a' #第四步
    def b():
        nonlocal name #第六步,获取a()的变量变量 name(a)
        name = "b" #第七步,修改a()的变量name的值a为b
    b() #第五步
    print(name) #第八步输出a的局部变量 b
print(name) #第二步:输出x
a() #第三步
print(name)#第九步:输出全局变量 x

global和nonlocal混合修饰:

name = 'x'
def a():
    global name 
    name = 'a'
    def b():
        nonlocal name #错误:no binding for nonlocal 'name' found 上层函数通过global将name声明为全局变量,无法获取。
        name = "b" 
    b() 
    print(name) 
print(name) 
a()
print(name)

猜你喜欢

转载自blog.csdn.net/qq_38344394/article/details/80505212