深入理解python函数传参机制
来源:互联网 发布:鲜花网络销售 编辑:程序博客网 时间:2024/06/05 02:12
首先需要申明的一点是,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
]
def
change(num,string,tupleset,listset):
num
+
=
1
string
+
=
' into new words!'
#tupleset.add(12) error
tupleset
=
(
12
,
3
,
4
,
4
)
listset.append(
10000
)
change(num,string,tupleset,listset)
print
num,string,tupleset,listset
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ans:
10
test (
1
,
2
,
3
) [
9
,
8
,
7
,
10000
]
看到结果是不是python中的对象和引用有了更深一步的了解了呢?
- 深入理解python函数传参机制
- 深入理解python函数传参机制
- 理解python函数传参机制
- 深入理解Python的包机制
- 深入理解C++虚函数机制
- 从Swift深入理解函数派发机制
- 深入理解python递归函数:汉诺塔游戏
- 深入理解面向对象析构函数回收机制
- Java中函数回调机制的深入理解
- 【python官方文档】深入理解python函数定义
- 深入理解Session机制
- 深入理解Session机制
- 深入理解Session机制 .
- 深入理解Notification机制
- 深入理解Notification机制
- 深入理解session机制
- 深入理解Handler机制
- 深入理解Proxy机制
- MyEclipse6.5 下Axis2插件的下载和安装
- 黑马程序员-高新技术(注解)
- 机器视觉界的大师
- debug : vs2010 bebug 模式下 RC2135 编译错误
- ajax返回html时如何打开新的窗口显示返回结果
- 深入理解python函数传参机制
- AndroidManifest.xml文件详解(uses-feature)
- squid介绍及其简单配置
- 高效 Java Web 应用开发框架 JessMA v3.2.2 正式发布
- 猴年马月去了(remove server calls from ws2_32)
- 超仟個應用程序及數據庫设计模板
- Precision and recall
- SetImageROI函数设置ROI区域的作用及用法————学习OpenCV笔记(三)
- hibernate中使用log4j日志框架设置