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使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
python实时分析日志的一个小脚本分享
May 07 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
python入门教程 python入门神图一张
Mar 05 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
python求最大连续子数组的和
Jul 07 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
Python操作json的方法实例分析
Dec 06 Python
python opencv调用笔记本摄像头
Aug 28 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
Python3.7实现验证码登录方式代码实例
Feb 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
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
php实现aes加密类分享
2014/02/16 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
图片自动更新(说明)
2006/10/02 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
Python实现简单的语音识别系统
2017/12/13 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Python实现Restful API的例子
2019/08/31 Python
pymysql的简单封装代码实例
2020/01/08 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
消防战士优秀事迹材料
2014/02/13 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
班级学习计划书
2014/04/27 职场文书
关于保护环境的建议书
2014/05/13 职场文书
保险专业求职信
2014/07/07 职场文书
单位未婚证明范本
2014/11/25 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
vscode中使用npm安装babel的方法
2021/08/02 Javascript