码迷,mamicode.com
首页 > 编程语言 > 详细

Python中的函数参数

时间:2016-08-24 01:16:19      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:python   函数   参数   可变对象   不可变对象   

      在讲函数参数之前还是简单的讲一下Python中的可变对象与不可变对象。

一、可变对象与不可变对象

     在Python中,一切皆对象,python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变(即在其创建后,值不能改变,但可创建新的对象并以同一变量名对其赋值,而旧的对象会被清理掉,这在python里叫对象的垃圾收集)。
不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dictionary)、列表型(list)

看下面例子:

i = 73
i += 2

技术分享

从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。

a = 1
b = 1
print a is b

输出的结果是True,这说明a和b指向同一对象,这在python里叫共享引用。在python中变量总是指向对象的指针,而不是可改变的内存区域的标签:给一个变量赋一个新值,并不是替换了原始对象(原始对象依旧在,只是没有变量去引用,最后被垃圾收集机制给回收了),而是让这个变量去引用完全不同的对象。


可变对象例子:

m = [5,9]

m += [6]

技术分享

其对象的内容是可以变化的。当对象的内容发生变化时,变量的对象引用(也就是内存地址)是不会变化的


二、函数的参数

对于函数传递参数时要注意:

(1)参数传递是通过自动将对象赋值给本地变量来实现的。函数参数在实际应用中只是python赋值的另一个实例而已。因为应用是以指针的形式实现的,所有的参数实际上都是通过指针进行传递的。

(2)在函数内部的参数名赋值不会影响调用者。

(3)改变函数的可变对象参数的值也许会对调用者有影响

第三条要仔细理解下,如下面例子

def changer(a,b):
    a = 2
    b[0] = "spam"

    
x = 1
L = [1,2]
changer(x,L)
print x,L

输出的结果并不是1,[1,2]   而是1,[‘spam‘,2]

如果对Python的作用域有了解的话,你会觉得x,L是全局变量,a,b是本地变量,调用后对全局变量无影响呀,但是要注意:L是列表,它是可变对象,它的值被赋予给b后,函数里第二个赋值语句是在原处改变这个对象,对b[0]进行赋值的结果会在函数返回后影响L的值。实际上并没有修改b,而是修改b当前所引用的对象的一部分,并且这个改变会影响调用者。

技术分享

由此可知:

. 不可变参数是“通过值”进行传递。像整数等不可变对象是通过对象引用而不是拷贝进行传递的,但是因为无论怎样都不可能在原处修改不可变对象,实际的效果就是很像创建了一份拷贝,浅拷贝

. 可变对象是通过“指针”进行传递。

所以要尽量避免可变对象参数的修改,可以用深拷贝来避免这个问题,也就是说将可变对象深拷贝一份传递到函数中,然后让函数调用拷贝的对象。如下:

方法一:

def changer(a,b):
    a = 2
    b[0] = "spam"

    
x = 1
L = [1,2]
changer(x,L[:])
print x,L

方法二:

def changer(a,b):
    b = b[:]
    a = 2
    b[0] = "spam"

    
x = 1
L = [1,2]
changer(x,L)
print x,L

如果不了解深拷贝和浅拷贝的话,自行谷歌一下,在此不做介绍,望谅解!


三、参数匹配模型

匹配模型主要有以下几个:

(1)位置:从左到右进行匹配

(2)关键字参数:通过参数名进行匹配

(3)默认参数:为没有传入值的参数定义参数值

 (4)可变参数:收集任意多基于位置或者关键字的参数

(5)可变参数:传递任意多的基于位置或关键字的参数

技术分享


Python中的函数参数

标签:python   函数   参数   可变对象   不可变对象   

原文地址:http://11026142.blog.51cto.com/11016142/1841703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!