前言:
全局变量:在全局中定义的变量,在整个文件中都可以使用。
局部变量:只在它定义的局部中可以使用,如函数中定义的变量,只能在函数中使用。
count = 0
def func():
count = 1
print("1 ->", count)
count += 1
print("2 ->", count)
func()
print("3 ->", count)
# 运行代码
"""
1 -> 1
2 -> 2
3 -> 0
"""
那如何在函数中修改全局变量呢?global
count = 0
def func():
global count
count = 1
print("1 ->", count)
count += 1
print("2 ->", count)
func()
print("3 ->", count)
# 运行结果
"""
1 -> 1
2 -> 2
3 -> 2
"""
我们从内存图的角度来看一下,为什么会有局部变量和全局变量这个概念呢
左边代码对应的内存空间中,为什么能存在两个count变量呢?因为函数中创建的count变量存在栈帧中,并不会影响到栈帧外面的变量,而栈帧将在函数执行完毕的那一刻释放空间,这也是为什么当函数执行完以后在输出count变量,不能和函数里输出一样的原因。
而右边代码,使用global声明,将要在此函数中使用全局变量count,因此函数中对count变量的操作,将不在栈帧中处理,所以会影响到全局变量count。
那如果不适用global,函数还有办法影响到全局变量中的数据吗?
函数的变量虽然保存在栈帧中,但是也仅仅只是保存变量,而变量存储的数据却不在栈帧中,所以,当在函数中改变可变数据类型中的数据时,如增加一个列表类型数据实参的元素时。注意:改变的是可变类型,数据内存空间的数据,而对可变类型重新赋值,然改变变量的内存地址是丝毫无用的。我们来看一段代码。
list_num = [0]
def change_list(list_number):
list_number[0] = 1
change_list(list_num)
print(list_num)
# 运行结果: [1]
那为什么这样可以改变呢,我们来画一下内存图。
栈帧里的变量操控了栈帧外的数据,栈帧虽然在函数执行完后被释放,但是数据的变化是永久的。