Python就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务 。但是你有没有想过,参数传递的底层是如何工作的,原理又是怎样的呢?
实际工作中,很多人会遇到这样的场景:写完了代码,一测试,发现结果和自己期望的不一样,于是开始一层层地 debug 。花了很多时间,可到最后才发现,是传参过程中数据结构的改变,导致了程序的“出错” 。
比如,我将一个列表作为参数传入另一个函数,期望列表在函数运行结束后不变,但是往往“事与愿违”,由于某些操作,它的值改变了,那就很有可能带来后续程序一系列的错误 。
因此,了解 Python 中参数的传递机制,具有十分重要的意义,这往往能让我们写代码时少犯错误,提高效率 。今天我们就一起来学习一下,Python 中参数是如何传递的 。
什么是值传递和引用传递如果你接触过其他的编程语言,比如 C/C++,很容易想到,常见的参数传递有 2 种:值传递和引用传递 。所谓值传递,通常就是拷贝参数的值,然后传递给函数里的新变量 。这样,原变量和新变量之间互相独立,互不影响 。比如,我们来看下面的一段 C++ 代码:
#include <IOStream>using namespace std; // 交换2个变量的值void swap(int x, int y) {int temp;temp = x; // 交换x和y的值x = y;y = temp;return;}int main () {int a = 1;int b = 2;cout << "Before swap, value of a :" << a << endl;cout << "Before swap, value of b :" << b << endl;swap(a, b);cout << "After swap, value of a :" << a << endl;cout << "After swap, value of b :" << b << endl;return 0;}Before swap, value of a :1Before swap, value of b :2After swap, value of a :1After swap, value of b :2
这里的 swap() 函数,把 a 和 b 的值拷贝给了 x 和 y,然后再交换 x 和 y 的值 。这样一来,x 和 y 的值发生了改变,但是 a 和 b 不受其影响,所以值不变 。这种方式,就是我们所说的值传递 。
所谓引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内存地址 。如果改变了其中任何一个变量的值,那么另外一个变量也会相应地随之改变 。
还是拿我们刚刚讲到的 C++ 代码为例,上述例子中的 swap() 函数,如果改成下面的形式,声明引用类型的参数变量:
void swap(int& x, int& y) {int temp;temp = x; // 交换x和y的值x = y;y = temp;return;}
那么输出的便是另一个结果:
Before swap, value of a :1Before swap, value of b :2After swap, value of a :2After swap, value of b :1
原变量 a 和 b 的值被交换了,因为引用传递使得 a 和 x,b 和 y 一模一样,对 x 和 y 的任何改变必然导致了 a 和 b 的相应改变 。
不过,这是 C/C++ 语言中的特点 。那么 Python 中,参数传递到底是如何进行的呢?它们到底属于值传递、引用传递,还是其他呢?
在回答这个问题之前,让我们先来了解一下,Python 变量和赋值的基本原理 。
a = 1b = aa = a + 1
这里首先将 1 赋值于 a,即 a 指向了 1 这个对象,如下面的流程图所示:
文章插图
接着 b = a 则表示,让变量 b 也同时指向 1 这个对象 。这里要注意,Python 里的对象可以被多个变量所指向或引用 。
文章插图
最后执行 a = a + 1 。需要注意的是,Python 的数据类型,例如整型(int)、字符串(string)等等,是不可变的 。所以,a = a + 1,并不是让 a 的值增加 1,而是表示重新创建了一个新的值为 2 的对象,并让 a 指向它 。但是 b 仍然不变,仍然指向 1 这个对象 。
因此,最后的结果是,a 的值变成了 2,而 b 的值不变仍然是 1 。
文章插图
通过这个例子你可以看到,这里的 a 和 b,开始只是两个指向同一个对象的变量而已,或者你也可以把它们想象成同一个对象的两个名字 。简单的赋值 b = a,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用 。
同时,指向同一个对象,也并不意味着两个变量就被绑定到了一起 。如果你给其中一个变量重新赋值,并不会影响其他变量的值 。
明白了这个基本的变量赋值例子,我们再来看一个列表的例子:
l1 = [1, 2, 3]l2 = l1l1.Append(4)l1[1, 2, 3, 4]l2[1, 2, 3, 4]
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Python爬虫遇到验证码的几种处理方式,文章末尾有源码
- python:栈的理解与应用
- 班章五寨都在那里,今大福班章金沱
- 玻璃膜是贴在玻璃外面还是里面 玻璃单向膜在外面真的看不见吗
- 枸杞鸽子煲靓汤的做法
- 斗罗大陆圣魂村武魂觉醒 斗罗大陆武魂在哪里觉醒
- 北京的茶道介绍,奥运村里的中国式智慧
- 高铁|时速350公里!郑渝高铁即将全线开通:郑州至重庆4小时可达
- 空调如何清洗过滤网 柜机空调清洗怎么清洗过滤网
- Python的从入门到精通的完整学习路线图