编程:从入门到放弃
    前言
    语言和环境
    +=
    C和C++
    Hex
    Map
    Scope(1):"这"是啥
    Scope(2)
    Singleton
    什么顺序
    从A到Z
    函数
    切分字符串
    初始化(1)
    初始化(2)
    单引号,还是双引号
    参数传递
    左,还是右
    引用
    时间(1)
    时间(2)
    时间(3)
    时间(4)
    时间(5)
    比大小
    流氓甘地
    相等,还是不等(1)
    相等,还是不等(2)
    相等,还是不等(3)
    相等,还是不等(4)
    第一个说了算,还是最后一个
    语言和环境
    除以0
    随机数

参数传递

Updated: 2021-12-12

入门。

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时,得到的是被修改后的那个列表。