参数传递

Updated: 2019-01-05

入门

Python 中往一个 list 里添加元素可以有这样几个方法:

>>> a = []
>>> a += [1]
>>> a = a + [2]
>>> a.append(3)
>>> a
[1, 2, 3]

坑!

我们来定义几个函数来重复上面的步骤:

>>> def append_one(b):
...     b += [1]
...
>>> def append_two(b):
...     b = b + [2]
...
>>> def append_three(b):
...     b.append(3)
...

完全一样的操作,放在函数里立马感觉离初级程序员又远了一步有没有。来执行一下:

>>> a = []
>>> append_one(a)
>>> append_two(a)
>>> append_three(a)
>>> a
[1, 3]

2呢?

进阶

函数外面我们的第一步初始化是这样的:a = []。注意等号的左右两边可不是一回事,右边是个空的列表,而等号左边的a只是一个变量,它指向了那个空列表;当把a传入到函数的时候,这时第三个东西出现了:函数中的b相当于a的一个副本,它也指向那个列表。append_one()append_three()中的操作,都是通过b找到了那个列表并对它进行了修改,而append_two()中是对b重新赋值,变量还是那个变量,但它指向的东西却不一样了,不在是起初的列表,所以接下来b发生任何事都跟它无关。从始至终函数中忙活的都是a的副本,变量a本身是没有变化的,始终指向着最初始的列表,所以最后打印a时,得到的是被修改后的那个列表。