[python]全局变量global,局部变量local

682 阅读5分钟

参考网址

blog.csdn.net/weixin_4934…

总结

- 全局变量就是放在函数外面的变量(在.py模块中的函数之外的变量)
- 函数内可以直接访问全局变量
- 函数内定义的变量是局部变量local
- 同名的局部变量会覆盖全局变量,但是仅会在具体的函数内生效
- 函数内修改全局变量需要用global,这样才会从根本上修改该变量,否则都只是在函数内生效。
- 全局变量不是真的全局变量,只是在模块内全局变量(不能直接import到其他文件中)

1/什么是全局变量global

就是在模块(.py)的任意地方都可以被调用的变量就是全局变量。
我们之所以使用全局变量,是因为我们希望这些变量不要被随意修改。
为了区分,我们一般用大写字母来定义全局变量。
全局变量是可以被修改的

使用模块法管理全局变量:
我们平时在开发项目的时候,在packager中创建一个文件,global_attr_list.py文件,
把所有的全局变量都放在这个global_attr_list.py文件中
然后在别的.py文件中使用全局变量的时候,导入该文件即可:import global_attr_list,
然后使用其中的全局变量,例如:
下面是存放全局变量的.py文件(这就是以模块的方式来管理全局变量)
global_list.py:
    GLOBAL_A = 'hello'
    GLOBAL_B = 'world'

test.py:
import global_list

def tt():
    print( global_list.GLOBAL_A )

if __name__=='__main__':
    test.py
    #输出:
    hello 

2/什么是局部变量local

在函数内定义的变量就是局部变量,如果不将其变成全局变量,则该变量就只能在函数内被使用。

3/全局变量和局部变量之间的关系

 一般来说:
 <0> 全局变量和局部变量是可以重名的
 <1> 在函数外定义的变量就是全局变量
 <2> 在函数内定义的变量就是局部变量,在函数声明/函数定义中的参数的变量也是局部变量
 <3> 局部变量只能在当前函数内中使用,外部不能使用,也就是外部访问不到。
 <4> 如果想在函数内定义一个全局变量,需要用到global关键词,来声明这个变量是全局变量
 <5> 当我们在函数内去使用一个变量的时候,首先会在这个函数内部找有没有这个变量(找的就是局部变量)
     如果有,那么就使用函数内的这个局部变量,
     如果在函数内部没有这个变量,那就去函数外找有没有这个变量(此时就是全局变量),
     如果有,则使用函数外部这个全局变量,
     如果函数外部也没有这个变量,则直接报错,NameError,name is not defined.
 <6> 如果必须在函数内定义一个变量,然后在函数外使用的话,则必须使用global关键词来声明这个变量是全局变量,这样脚本的其他地方就可以访问这个变量
 hou.py
 name = "helloworld"

 def f1():
     name = "aaa"  # 这里定义了一个局部变量,和全局变量重名,但是确实两回事
     print(name)  # 这里打印的是局部变量

 def f2():
     print(name)  # 这里打印的是全局变量
 f1()
 f2()
 

 sun.py
 name = "helloworld"

 def f1():
     global name  
     # 有了这句代码,说明函数f1()中的变量name变成了全局变量,
     # 在这里对全局变量进行了修改,即重新赋值 
     name = "xxx"
     print(name)  # 这里打印的是全局变量

 def f2():
     print(name)  # 这里打印的是全局变量
 

全局变量可以在函数中直接访问

 全局变量可以在函数中直接被访问,这里说的是:直接读取他的值,而不是改写它
a = 8

def f1():
    print(a)
f1()
>>> 8
# 全局变量可以在函数中直接访问(直接读取他的值,而不是改写它)

同名的局部变量会覆盖全局变量

a = 10  # 这里定义了一个全局变量
def f3():
    a = 18  # 这里是定义了一个局部变量,但是巧的是:和函数外的全局变量重名
    print(a)
f3()

print(a)
>>> 18
>>> 10
# 从结果可以知道,虽然当局部变量和全局变量重名的时候,局部变量虽然会覆盖全局变量,但是只影响了函数内。
# 但是,这只是在函数内生效,在函数外a还是10

在函数内,彻底的修改全局变量

从上面的例子可以知道,在函数内修改全局变量,只是暂时的,只是在函数内生效。
要想彻底的修改全局变量,则需要用global关键字
a = 10  # 这里定义了一个全局变量
def f3():
    global a 
    a = 18
    print(a)
f3()

print(a)
>>> 18
>>> 18
a = 10  # 这里定义了一个全局变量
def f3():
    global a
    a = 18  
    print(a)
f3()


def f4():
    print(a)
f4()
print(a)
>>> 18
>>> 18
>>> 18
# 在f3()中,我们通过global关键词,彻底的修改了全局变量a,所以在f4()中访问全局变量,也是18
# 在函数外打印a,也是18

如果全局变量是list类型,那么在函数内直接修改该变量,是可以改变全局变量的

a = [11, 22, 33]  # 定义一个全局变量


def f():
    a.append(44)  # 在函数内修改全局变量
    print(a)

f()

print(a)
# 结果
[11, 22, 33, 44]
[11, 22, 33, 44]
# 从结果中可以看到,在函数内不用global关键词来修改全局变量是可以的,但是前提是全局变量是list类型,而不是string类型
a = "111"

def f():
    a = "222"
    print(a)

f()

print(a)
# 结果
222
111

在1个函数内用global定义的全局变量,可以在别的函数内被使用

def f():
    global a,c
    a = "222"
    c =  111
    print(a)

f()


def f1():
    print(a)
    print(c)


f1()
# 结果
222
222
111