Python参数传递实现过程及原理详解


Posted in Python onMay 14, 2020

在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递。

python变量以及赋值

数值

从几行代码开始

In [1]: a = 1
In [2]: b = a
In [3]: a = a + 1

我们先将1赋值给a,也就是a指向了1这个对象,在python中一切皆对象。接着b=a,则表示让b也指向了1这个对象,python中一个对象是可以被多个引用所指向。最后执行的a=a+1,这里需要注意一点,python的数据类型中如int、str等不可变类型,执a=a+1这种操作,并不是把a指向的对象的值增加1,而是生成一个新的对象2,并让a指向2这个对象,原来的对象还存在于内存中。那这里的话还是会被指向,我们来分别看一下a和b的值:

In [4]: a
Out[4]: 2

In [5]: b
Out[5]: 1

通过这个例子你可以看到,这里的 a 和 b,开始只是两个指向同一个对象的变量而已,或者你也可以把它们想象成同一个对象的两个名字。简单的赋值 b = a,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。同时,指向同一个对象,也并不意味着两个变量就被绑定到了一起。如果你给其中一个变量重新赋值,并不会影响其他变量的值。

列表

还有一个列表的例子,再来瞅瞅:

In [6]: l1 = [3,4,5,6]
In [7]: l2 = l1
In [10]: l1.append(7)
In [11]: l1
Out[11]: [3, 4, 5, 6, 7]
In [12]: l2
Out[12]: [3, 4, 5, 6, 7]

代码中,我们让l1和l2这两个变量都指向了[3,4,5,6]这个对象,我们知道列表是一种可变的数据结构,所以append操作并不会产生新的对象,只是在末尾添加了一个元素,变成了[3, 4, 5, 6, 7],由于 l1 和 l2 同时指向这个列表,所以列表的变化会同时反映在 l1 和 l2 这两个变量上,那么,l1 和 l2 的值就同时变为了[3, 4, 5, 6, 7]。

对象删除

python中变量是可以删除的,但是对象是没办法删除的

In [22]: a = [1,4,5]

In [23]: del a

del语句删除a这个变量,就无法通过a访问[1,4,5],但是这个对象在存在中还是存在的,python的垃圾回收机制发现引用为0的时候就会把它回收掉。

总结

  • 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向
  • 可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量
  • 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象
  • 变量可以被删除,但是对象无法被删除

python函数是如何进行参数传递的

python的参数传递是赋值传递或者说是引用传递,python里一切皆对象,所以参数传递时,只是让新变量与原变量指向了同一个对象,下面我们来看个例子:

In [28]: def func(b):
  ...:   b = 2

In [29]: a = 1

In [30]: func(a)

In [31]: a
Out[31]: 1

这里的参数传递,使变量 a 和 b 同时指向了 1 这个对象。但当我们执行到 b = 2 时,系统会重新创建一个值为 2 的新对象,并让 b 指向它;而 a 仍然指向 1 这个对象。所以,a 的值不变,仍然为 1。

如何改变a的值呢?

我们可以在函数中将b返回

def func(b):
  b = 2
  return b
a = 1
a = func(a)
a
2

上面的例子我们的是int类型的,下面我们看一下列表的例子:

def func(l2):
  l2.append(77)

l1 = [12,3,6]
func(l1)
l1
[12,3,6,77]

这里 l1 和 l2 先是同时指向值为[1, 2, 3]的列表。不过,由于列表可变,执行 append() 函数,对其末尾加入新元素 4 时,变量 l1 和 l2 的值也都随之改变了.

那大家看一下面的例子,结果是什么呢?

def func(l2):
  l2 = l2 + [4]

l1 = [12,3,6]
func(l1)
l1
[12,3,6]

可以看到,l1没有发生变化,原因是l2 + [4]这个操作表示创建了一个末尾加入元素 4的新列表,并让 l2 指向这个新的对象,l1还是指向原有的对象。

总结

今天,我们讨论了 Python 的变量及其赋值的基本原理,并且解释了 Python 中参数是如何传递的。和其他语言不同的是,Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递。需要注意的是,这里的赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
解析Python3中的Import
Oct 13 Python
python turtle 绘制太极图的实例
Dec 18 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
python实现人像动漫化的示例代码
May 17 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 #Python
详解python中groupby函数通俗易懂
May 14 #Python
django 解决扩展自带User表遇到的问题
May 14 #Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 #Python
Python基于numpy模块实现回归预测
May 14 #Python
Django之全局使用request.user.username的实例详解
May 14 #Python
Django使用Profile扩展User模块方式
May 14 #Python
You might like
桌面中心(三)修改数据库
2006/10/09 PHP
PHP 字符串分割和比较
2009/10/06 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
php文件读取方法实例分析
2015/06/20 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
python获取糗百图片代码实例
2013/12/18 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
TensorFlow利用saver保存和提取参数的实例
2018/07/26 Python
python中 * 的用法详解
2019/07/10 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
管理科学大学生求职信
2013/11/13 职场文书
总经理任命书范本
2014/06/05 职场文书
硕士生找工作求职信
2014/07/05 职场文书
社区安全温馨提示语
2015/07/14 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
vue特效之翻牌动画
2022/04/20 Vue.js