2.1 变量
在编程语言中可以定义变量。在Python中,我们使用=来定义变量,与其他语言的变量可以存储真实值不一样的是,Python中的变量的名称是与实际数据相关联的“代号”(如指针)。与数学中=的意义有所不同,Python中的=代表着赋值,它用于执行赋值的操作。例如n = 0
,意味着将0
这个值赋上一个别称n
。
需要注意的是,通常来说,Python中所有东西都是对象,所谓万物皆对象,数字、字符串、函数等都是对象(2.8节会详细说明对象),而变量赋值就是将变量关联某个对象。可以把对象想象成一个盒子,变量是盒子外面贴的小纸条,如图2-1所示。
同一个变量所指代的对象是可以变化的,就像盒子上的小纸条一样,我们随时可以通过新的赋值操作把写有n
的小纸条撕下来,贴到新的对象上。例如,另外赋值n = 1
,如图2-2所示。
图2-1 变量名只是某个对象的代号
图2-2 变量的重新赋值只是对代号的“迁移”
在Python中对变量进行赋值并不是将0改成1,而是将贴在0这个值上的小纸条撕下来,贴到1这个值上。尝试理解这一点,这在后续将会帮助你理解为什么Python中的变量会有某些“反直觉”的特征。
除此之外,同一个对象也可以被多个变量所指向。例如,m = n
,如图2-3所示。
图2-3 同一个对象可以有多个别称
例如:
n = 1
m = n
print(m is n)
n = 2
print(m)
返回结果为:
True
1
从代码的运行中可以看出,这时m
所指代的对象就是n
所指代的对象,并且这时如果将写有n
的小纸条撕下来贴到其他对象上,也不会影响m
所指代的对象。
当一个对象没有被任何变量引用时,也就是对象盒子上没有贴任何纸条时,这个对象将被Python解释器销毁,再也找不回来,如图2-4所示。
图2-4 没有别称的对象会被销毁
你可能会想,0这个数怎么可能会被销毁,重新赋值不就回来了吗?实际上这里被销毁的是前面介绍的0这个对象(装有0数字的这个盒子),而后面重新赋值生成的对象(新盒子)将不再是原来的对象(即使它们都代表0这个数字,但它们仍然不是同一个对象)。
我们可以将已经赋值过的变量和数值混合使用。
例如:
a = 10
print(a + 2)
print(a)
返回结果为:
12
10
上面的代码中出现了a + 2
,但是计算出的结果并没有赋给任何变量,所以也就没有改变a
的值。
如果想把a + 2
的结果赋值给a
,那可以这样写:
a = a + 2
print(a)
输出结果为:
12
需要再次强调的是,从数学上来说a = a + 2
这个式子并不成立,在Python中=
是赋值操作符,上面的代码等价于:
a = 10
temp = a + 2
a = temp
print(a)
输出结果为:
12
变量名只能包括以下字符:
● 大小写字母(a~z,A~Z);
● 数字(0~9);
● 下划线(_)。
变量名不允许以数字开头,字母为全大写的变量表示常量,例如PI = 3.14(实际上Python中并不存在保证PI不被修改的机制,所以通常约定字母为全大写的变量为常量,以告知使用者不要尝试去修改它)。
此外,不能将Python中的关键字作为变量名,它们是Python语法的组成部分,关键字如表2-1所示。(在Python 2中,print是关键词,在Python 3中它是函数。)
表2-1 关键字