python进行参数传递的方法


Posted in Python onMay 12, 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的时候就会把它回收掉。

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

变量可以被删除,但是对象无法被删除

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如何进行参数传递的的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的Flask开发框架简单上手笔记
Nov 16 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python实现校园网自动登录的示例讲解
Apr 22 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
python matlibplot绘制多条曲线图
Feb 19 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
关于numpy数组轴的使用详解
Dec 05 Python
Python hashlib模块实例使用详解
Dec 24 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
python输出数学符号实例
May 11 #Python
使用matlab 判断两个矩阵是否相等的实例
May 11 #Python
Django models文件模型变更错误解决
May 11 #Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 #Python
Django静态资源部署404问题解决方案
May 11 #Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 #Python
Selenium元素定位的30种方式(史上最全)
May 11 #Python
You might like
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
js三种排序算法分享
2012/08/16 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
JQuery基础语法小结
2015/02/27 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
用C++封装MySQL的API的教程
2015/05/06 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
python打包成so文件过程解析
2019/09/28 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
材料工程专业毕业生求职信
2014/03/04 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
优秀护士事迹材料
2014/12/25 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL