首页 / 知识
深入理解python函数传参机制
2023-11-12 13:46:00
首先需要申明的一点是,python里是没有像C和C++里那样按值传参的说法的。python中的所有东西都是对象,这也是它的强大之处,它没有基本类型之说。
在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。
类型是属于对象的,而不是变量。这样,很多问题就容易思考了。
python中的对象可分为一两大类,即可改变的(mutable)和不可改变的(immutale).
而属于immutable类的对象主要有strings,tuples,numbers,而列表,字典等其它对象则属于mutale类的对象。
由于python中所有东西都是对象,因此python中的函数传参方式都是按引用传参的(可以理解为传的是指针),具体细节的话,我想就不需要我来说了,相信大家都已经很熟悉按引用传参的方式方法了。
补充:我刚才又仔细看了下上面的内容,可能光凭下面一个案例,一些新手可能还不太明白,因此我在这再做两点个人的总结。
由于函数都是按引用传的,那就出现了一种可能,假如我传一个参数arg进去,但我不希望该参数arg在函数内修改后而影响到函数外的变量arg,如果要达到这种效果是不是有点想其它语言里的传变量复本,对不对?但是在python里没有复本一说,但是它给出了一类对象(immutable不可改变对象,个人估计,这类对象很可能就是因为这样的原因而被创造出来的,呵呵)。那现在我们假设传入一个immutable变量对象imvar到函数内,并在函数内对imvar进行修改操作,由于imvar是不可改变对象,所以在对其进行修改时,编译器会首先为其创建一个复制对象copy_imvar再对之进行修改,所以函数中修改的实际上不是最初的对象imvar了,因此它的值仍是进入函数处理前的值。相反地如果传是可变类型变量的话,那则是直接在引用上修改,因此在函数内外操作的都是同一对象,因此函数内的操作会直接影响到函数外的相同变量的值。不知道现在是否好理解些,如果还不是很明白,结合下面的例子看看应该会明白了吧。
下面直接给出一个测试案例:
#test
num=10
string='test'
tupleset=(1,2,3)
listset=[9,8,7]
defchange(num,string,tupleset,listset):
num+=1
string+='intonewwords!'
#tupleset.add(12)error
tupleset=(12,3,4,4)
listset.append(10000)
change(num,string,tupleset,listset)
printnum,string,tupleset,listset
------------------------------------------------
ans:10test(1,2,3)[9,8,7,10000]
看到结果是不是python中的对象和引用有了更深一步的了解了呢?
以上内容为大家介绍了深入理解python函数传参机制,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
如何将python添加到环境变量?
如何将python添加到环境变量?,系统,信息,工作,环境变量,命令,窗口,步骤,变量,路径,以下,Python是一种被广泛使用的编程语言,许多人都喜欢使用Pypython是面向对象还是面向过程的
python是面向对象还是面向过程的,数据,代码,基础,形态,培训,术语,设计,对象,过程,语言,Python虽然是解释型语言,但从设计之初就已经是一门面向Python之数据库游标对象详解
Python之数据库游标对象详解,软件,代码,一致,培训,数据库,游标,对象,方法,事务,操作,常用数据库:MySQL、Oracle、SQLite但是包嵌入到Python中python的数据类型
python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.整型Python可以处理任意大小的整数,当然包括负整数,在程序中的表示Python操作MySQL
Python操作MySQL,数据,异常,培训,语句,操作,事务,对象,光标,数据库,游标,在做python自动化时,结果断言很重要,相较数据固定校验(数据维护比较复使用Python的toolz库开始函数式编
使用Python的toolz库开始函数式编程,代码,函数,培训,位置,参数,字典,顺序,操作,结果,测试,toolz库允许你操作函数,使其更容易理解,更容易测试代优化 Python 程序的内存占用
优化 Python 程序的内存占用,代码,数据,情况,培训,对象,字典,内存,垃圾,程序,机制,Python的垃圾回收机制通过引用计数来决定一个对象要不要被为什么Python没有main函数?
为什么Python没有main函数?,入口,代码,灵活,函数,培训,状态,统一,项目,网上,名称,毫无疑问,Python中没有所谓的主入口函数,但是互联网上经常有文如何理解Python一切都是变量的说法
如何理解Python一切都是变量的说法?,名称,对象,代码,名字,地址,情况,数字,概念,培训,列表,Python的好处之一是与其他语法繁重的语言相比,PythoPython内置函数
Python内置函数,数字,函数,培训,位置,第一,代码,异常,数据,公式,序列,python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好Python 的重试机制
Python 的重试机制,异常,代码,网络,培训,函数,机制,间隔,之前,错误,条件,为了避免由于一些网络或等其他不可控因素,而引起的功能性问题。比如使用 Python 函数进行模块化
使用 Python 函数进行模块化,代码,时间,函数,工作,名称,通用,系统,信息,项目,培训,你是否对函数、类、方法、库和模块等花哨的编程术语感到困