2.3 在变量中存储值
也可以把表达式的计算结果的值存储到变量中,以便后面可以使用它。可以把变量当做是一个可以保存值的盒子。
一条赋值语句指令会把一个值保存到一个变量中。输入变量的名称,后边跟着等号(=称为赋值操作符),然后是要存储到这个变量中的值。例如,在交互式shell中输入spam = 15:
>>> spam = 15
>>>
这将把值15存储到spam变量的盒子中,如图2-4所示。名字“spam”是盒子的标签(Python由此可以识别变量),而值写在盒子中的一张便签上。
当按下回车键时,你不会看到任何响应。在Python中,如果没有出现错误,就表示成功地执行了指令。然后将会出现>>>提示符,你可以输入下一条指令了。
和表达式不同,语句是不会计算为任何值的指令。正因为如此,在spam = 15之后,交互式shell的下一行中没有显示任何的值。如果你不清楚哪些指令是表达式,哪些指令是语句,那么请记住:表达式会得到一个值,而任何其他类型的指令都是一条语句。
变量保存的是值而不是表达式。例如,考虑一下语句spam = 10 + 5和spam = 10 + 7 - 2中的表达式。它们的运算结果都是15。最终结果是相同的:两条赋值语句都把值15保存到了变量spam中。
第一次在赋值语句中使用一个变量的时候,Python将会创建该变量。要查看变量中的值,在交互式shell中输入该变量的名称:
>>> spam = 15
>>> spam
15
表达式spam得到了变量spam中的值,即15。可以在表达式中使用变量。尝试在交互式shell中输入如下指令:
>>> spam = 15
>>> spam + 5
20
我们已经把变量spam的值设置为15,所以输入spam + 5就像是输入表达式15 + 5一样。下面是spam + 5的运算步骤:
spam + 5
▼
15 + 5
▼
20
在赋值语句创建变量之前,不能使用该变量。否则,Python将会给出一个NameError的错误,因为尚不存在该名称的变量。输错了变量名称也会得到这样一个错误:
>>> spam = 15
>>> spma
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
spma
NameError: name 'spma' is not defined
出现这个错误,是因为虽然有spam变量,但是并没有名为spma的变量。
可以通过输入另一条赋值语句来修改变量中存储的值。例如,尝试在交互式shell中输入如下语句:
>>> spam = 15
>>> spam + 5
20
>>> spam = 3
>>> spam + 5
8
当第一次输入spam + 5时,表达式的计算结果是20,因为我们把15存储在spam中。然而,当输入spam = 3时,用值3替代(或覆盖)了值15。现在,当我们输入spam + 5时,表达式的计算结果是8,因为现在spam的值是3。覆盖的过程如图2-5所示。
甚至可以使用spam变量中的这个值,来给spam赋一个新的值:
>>> spam = 15
>>> spam = spam + 5
20
赋值语句spam = spam + 5的意思是:“spam变量中的新值是,spam当前的值加上5”。通过在交互式shell中输入如下的语句,让spam中的值持续几次增加5:
>>> spam = 15
>>> spam = spam + 5
>>> spam = spam + 5
>>> spam = spam + 5
>>> spam
30
使用多个变量
在程序中,可以根据需要创建任意多个变量。例如,让我们给名为eggs和bacon的两个变量分配不同的值,如下所示:
>>> bacon = 10
>>> eggs = 15
现在,变量bacon中是10,变量eggs中是15。每个变量都有自己的盒子,其中拥有其自己的值,如图2-6所示。
尝试在交互式shell中输入spam = bacon + eggs,然后查看spam中的新值:
>>> bacon = 10
>>> eggs = 15
>>> spam = bacon + eggs
>>> spam
25
现在,spam中的值是25。当把bacon和eggs相加时,就是把其值10和15相加。变量包含的是值而不是表达式。把值25赋给变量spam,而不是把表达式bacon + eggs赋给变量。在spam = bacon + eggs赋值语句之后,对于bacon或者eggs的修改不会再影响到spam。