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 图片验证码代码
Dec 07 Python
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Python读取图片属性信息的实现方法
Sep 11 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
python中子类与父类的关系基础知识点
Feb 02 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
php操作mysql数据库的基本类代码
2014/02/25 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Python映射拆分操作符用法实例
2015/05/19 Python
Python入门学习指南分享
2018/04/11 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
什么是python的必选参数
2020/06/21 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
行政人员工作职责
2013/12/05 职场文书
美德好少年事迹材料
2014/01/19 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
个人担保书范文
2014/05/20 职场文书
会计学专业自荐信
2014/06/25 职场文书
婚宴领导致辞
2015/07/28 职场文书
导游词之阆中古城
2019/12/23 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL