3.2 变量赋值

本节主题是变量赋值。我们将在3.3小节中讨论什么样的标识符才是合法的变量名。

3.2.1 赋值操作符

Python语言中,等号(=)是主要的赋值操作符(其他的是增量赋值操作符)。

3.2 变量赋值 - 图1

注意,赋值并不是直接将一个值赋给一个变量,尽管你可能根据其他语言编程经验认为应该如此。在Python语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。如果此刻你还不是100%理解清楚,也不用着急。在本章的后面部分,我们还会再讨论这个话题,现在你只需要有这么一个概念即可。

同样的,如果你比较熟悉C,你会知道赋值语句其实是被当成一个表达式(可以返回值)。不过这条并不适合于Python,Python的赋值语句不会返回值。类似下面的语句在Python中是非法的。

3.2 变量赋值 - 图2

链式赋值没问题,比如(本章稍后部分会给出更多的例子):

3.2 变量赋值 - 图3

3.2.2 增量赋值

从Python 2.0开始,等号可以和一个算术操作符组合在一起,将计算结果重新赋值给左边的变量。这被称为增量赋值,类似下面这样的语句:

3.2 变量赋值 - 图4

现在可以被写成:

3.2 变量赋值 - 图5

增量赋值通过使用赋值操作符,将数学运算隐藏在赋值过程当中。如果你用过C、C++或者Java,会觉得下面的操作符很熟悉。

3.2 变量赋值 - 图6

增量赋值相对普通赋值不仅仅是写法上的改变,最有意义的变化是第一个对象(我们例子中的A)仅被处理一次。可变对象会被就地修改(无修拷贝引用),不可变对象则和A=A+B的结果一样(分配一个新对象),我们前面提到过,有一个例外就是A仅被求值一次。

3.2 变量赋值 - 图7

Python不支持类似x++或—x这样的前置/后置自增/自减运算。

3.2.3 多重赋值

3.2 变量赋值 - 图8

在上面的例子中,一个值为1的整型对象被创建,该对象的同一个引用被赋值给x、y和z。也就是将一个对象赋给了多个变量。当然,在Python当中,将多个对象赋给多个变量也是可以的。

3.2.4 “多元”赋值

另一种将多个变量同时赋值的方法我们称为多元赋值(multuple)。这不是Python官方术语,而是我们将“mul-tuple”连在一起自创的。因为采用这种方式赋值时,等号两边的对象都是元组(我们在2.8节讲过元组是一种Python基本数据类型)。

3.2 变量赋值 - 图9

在上面的例子里,两个整型对象(值分别为1和2)及一个字符串对象,被分别赋值给x, y和z。通常元组需要用圆括号(小括号)括起来,尽管它们是可选的。我们建议总是加上圆括号以使你的代码有更高的可读性。

3.2 变量赋值 - 图10

在其他类似C的语言中,如果你要交换两个值,你会想到使用一个临时变量如tmp来临时保存其中一个值。

3.2 变量赋值 - 图11

在上面的C代码片段中,变量x和变量y的值被互相交换。临时变量tmp用于在将y赋值给x前先保存x的值。将y的值赋给x之后,才可以将保存在tmp变量中的x的值赋给y。Python的多元赋值方式可以实现无需中间变量交换两个变量的值。

3.2 变量赋值 - 图12

显然,Python在赋值之前已经事先对x和y的新值做了计算。