Python参数传递实现过程及原理详解
作者:yaominghui 发布时间:2021-07-11 20:16:07
在分析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下载安装1、Python官方下载地址:https://www.python.org/downloads官方下载速度太慢,你可
- 主题众所周知,django.forms极其强大,不少的框架也借鉴了这个模式,如Scrapy。在表单验证时,django.forms是一绝,也
- 交换变量 x = 6y = 5x, y = y, xprint x>>> 5print y>>>
- 这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- python类私有属性和公共属性对于python而言,类的属性的可见度只有两种,public和private。类的私有属性便是在前面加上&a
- 顽固的Select下拉列表,一般很难用css来控制样式下面使用了js来美化select<!DOCTYPE html PUBLIC &q
- 已解决卸载pip重新安装的方法问题需求粉丝群里面的一个小伙伴遇到问题跑来私信我,想用卸载pip重新安装pip,但是发生了报错(当时他心里瞬间
- 最近刚好有朋友遇到个global相关的问题,这里简单学习一下global关键字的用法。想要更好的了解global关键字,首先要熟悉pytho
- 这份代码不是那种时间没有改变也输出innerHTML的高消耗代码。innerHTML和style的改变是非常消耗游览器性能的,如果你将来希望
- 一、前言在Python开发的过程中,为了实现某项功能,经常需要对某些字符串进行特殊的处理,如拼接字符串、截取字符串、格式化字符串等。下面将对
- python爬虫用mongodb的原因:1、文档结构的存储方式简单讲就是可以直接存json,list2、不要事先定义”表”,随时可以创建3、
- 一、请求扩展1.before_request作用: 类比django中间件中的process_request,在请求到来执行路由函数之前先执
- 在创建SQL Server 2000 故障转移群集之前,必须配置 Microsoft 群集服务 (MSCS) 并使用 Microsoft W
- 在找工作的时候,我们会选择上网查询招聘的信息,或者是通过一些招聘会进行现场面试。但由于信息更新不及时,有一些岗位会出现下架的情况,如果我们不
- 近又开始做网页,发现之前写的页面不规范,这次从头在来,希望一次比一次进步,先从CSS中的标点符号开始吧,这篇做为草稿已经放了很长时间了,还是
- 1.ResNet的创新现在重新稍微系统的介绍一下ResNet网络结构。 ResNet结构首先通过一个卷积层然后有一个池化层,然后通过一系列的
- 本文为大家分享了Python文本特征抽取与向量化的具体代码,供大家参考,具体内容如下假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自
- 如何显示SQL数据库所有表的名称?<%strSQLDSN = "xxxx"strSQLUser
- 关联规则挖掘(Association rule mining)是数据挖掘中最活跃的研究方法之一,可以用来发现事情之间的联系,最早是为了发现超