Python作用域(Python系列14)

文章讲述了全局变量和局部变量的概念,通过内存图解释它们在函数中的作用。局部变量在函数执行结束后释放,而全局变量可通过`global`声明影响。函数内的可变数据类型更改会持久影响外部数据,即使函数结束。
摘要由CSDN通过智能技术生成

前言:

全局变量:在全局中定义的变量,在整个文件中都可以使用。

局部变量:只在它定义的局部中可以使用,如函数中定义的变量,只能在函数中使用。

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]

那为什么这样可以改变呢,我们来画一下内存图。

 栈帧里的变量操控了栈帧外的数据,栈帧虽然在函数执行完后被释放,但是数据的变化是永久的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值