Python变量的引用及在函数参数和返回值中的应用

在学习函数的时候,想到 C++ 中函数传递参数时有传值、传地址和引用,就想在 Python 中函数传参到底传的是值还是地址?而函数的参数和返回值都和变量有关,那么函数形参接收到的和返回的到底是变量的值还是变量的引用呢?要知道函数的参数传递和返回值是什么,就要先了解变量的引用。

我们知道变量在使用之前都需要先进行赋值,只有赋值了,这个变量才会被创建。

而变量由标识(id)、类型(type)和值(value)三部分组成的。

变量的引用

变量是被一个数据赋值了才会被创建。在 Python 中,变量和数据是分开存储在内存中的:

其中数据保存在内存中的一个位置上,而在变量中保存的却是数据在内存中的地址。其中:变量记录数据的内存地址这个动作就叫做引用

通过内置函数 id() 可以查看变量中保存数据所在的内存地址。

>>> a = 123
>>> id(a)
1737568620592
>>> type(a)
<class 'int'>
>>> a
123
图片[1]-Python变量的引用及在函数参数和返回值中的应用-尤尤'blog
a=123的简单内存示意图

在上面的代码中,面对一个赋值语句,我们先看赋值号右侧是 123,在内存中开辟一块内存空间来存储它,这片内存空间的地址是 1737568620592,再看赋值号左侧,是一个变量 a ,用来记录 123 在内存中的地址 1737568620592,这也就意味着变量 a 引用了数字 123。

注意:给一个变量多次赋值,本质是修改了数据的引用。

这时变量始终都是对新赋值的数据的引用,以前的数据都成为了内存垃圾,被回收了。

图片[2]-Python变量的引用及在函数参数和返回值中的应用-尤尤'blog
变量重新赋值的简单内存示意图

可以简单理解为 a 是一个标签,存储数据的是一个盒子,当 a = 123 时,就把标签 a 贴到存储 123 的盒子上面。当 a = ‘hello’ 时,就是把标签 a 从装 123 的盒子上面撕下来,贴到装 ‘hello’ 的盒子上面。

在函数中的应用 — 参数和返回值

函数的参数分为形参和实参,实参是在函数调用时传入的真实数据,而形参是用于接收用户传递的数据,而作为形参的变量是用于在函数中使用的,也就是说形参是一个局部变量。

在 Python 中,函数的实参和返回值传递的都是存储数据的引用,而不是数据本身。

# 当函数被调用时,Python 解释器会准备一个变量a,让它引用实参100。
def fun(a):
    print(f'{a}在函数体内的内存地址是: {id(a)}')
    num = a * 2
    print(f'返回值{num}在函数内的内存地址是:{id(num)}')
    # 返回的是对存储数据的引用,而不是存储的数据。
    return num


m = 100
print(f'{m}在调用函数前的内存地址是:{id(m)}')

# 调用fun()函数时,本质上传递的是实参存储数据的引用,而不是实参存储的数据100。
result = fun(m)

print(f'返回值{result}在内存中的地址是:{id(result)}')

print(f'调用函数后,实参{m}在内存中的地址是:{id(m)}')
图片[3]-Python变量的引用及在函数参数和返回值中的应用-尤尤'blog
图片[4]-Python变量的引用及在函数参数和返回值中的应用-尤尤'blog

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容