代码改变世界

python函数的参数传递是传值还是传引用?

2017-02-25 23:13 老左的博客 阅读(...) 评论(...) 编辑 收藏

来看一个例子:

def func(val):
    val.append(100)
    val = ['x', 'y', 'z']
    return val

L = [1, 10]
print func(L)
print L

应该打印出什么呢?

可能大多数人会任务打印以下内容

['x', 'y', 'z']

['x', 'y', 'z']

错了,以下打印内容才是正确的:

['x', 'y', 'z']

[1, 10, 100]

 

为什么呢?我们接下来讲下Python函数的参数传递

我们首先明确一些概念:Python中的变量对象。 
Python中的变量是没有类型的,我们可以把它看做一个(*void)类型的指针,变量是可以指向任何对象的,而对象才是有类型的。 
而且Python中的对象有可变对象(number,string,tuple等)和不可变对象之分(list,dict等)。 
比如下面的例子:

nums = (1, 2, 3)
type(nums)    #输出:tuple
id(nums)    #输出:59179256
nums = [1, 2, 3] 
type(nums)    #输出:list
id(nums)    #输出:59094960

可以看到nums是没有类型的,它可以指向一个tuple也可以指向一个list,从id就可以看出nums指向了不同的对象。 
明白了这个概念,那么我们可以说Python中函数参数的传递是传递的变量的值。 
而且我们有下面的规律: 
1. 不可变对象作为函数参数,相当于C系语言的值传递。 
2. 可变对象作为函数参数,相当于C系语言的引用传递。