在学习函数的时候,想到 C++ 中函数传递参数时有传值、传地址和引用,就想在 Python 中函数传参到底传的是值还是地址?而函数的参数和返回值都和变量有关,那么函数形参接收到的和返回的到底是变量的值还是变量的引用呢?要知道函数的参数传递和返回值是什么,就要先了解变量的引用。
我们知道变量在使用之前都需要先进行赋值,只有赋值了,这个变量才会被创建。
而变量由标识(id)、类型(type)和值(value)三部分组成的。
变量的引用
变量是被一个数据赋值了才会被创建。在 Python 中,变量和数据是分开存储在内存中的:
其中数据保存在内存中的一个位置上,而在变量中保存的却是数据在内存中的地址。其中:变量记录数据的内存地址这个动作就叫做引用。
通过内置函数 id() 可以查看变量中保存数据所在的内存地址。
>>> a = 123
>>> id(a)
1737568620592
>>> type(a)
<class 'int'>
>>> a
123
在上面的代码中,面对一个赋值语句,我们先看赋值号右侧是 123,在内存中开辟一块内存空间来存储它,这片内存空间的地址是 1737568620592,再看赋值号左侧,是一个变量 a ,用来记录 123 在内存中的地址 1737568620592,这也就意味着变量 a 引用了数字 123。
注意:给一个变量多次赋值,本质是修改了数据的引用。
这时变量始终都是对新赋值的数据的引用,以前的数据都成为了内存垃圾,被回收了。
可以简单理解为 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)}')
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
暂无评论内容