
2.2 常量和变量
2.2.1 变量
变量的概念基本上和初中代数中的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量在程序中用一个变量名表示,变量名必须是大小写英文、数字和“_”的组合,且不能以数字开头。例如:

在Python中,等号(=)是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。例如:

Python语言采用基于值的内存管理方式,不同的值分配不同的内存空间。可理解为,Python变量并不是某一个固定内存单元的标识,而是对内存中存储的某个数据的引用,这个引用是可以动态改变的。
这种变量本身类型不固定的语言称为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值时类型不匹配,就会报错。例如,C语言是静态语言,赋值语句如下(//表示注释):

同静态语言相比,动态语言更灵活,就是这个原因。
不要把赋值语句的等号等同于数学的等号。例如下面的代码:

如果从数学上理解x = x+2无论如何是不成立的。在程序中,赋值语句先计算右侧的表达式x+2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12。
理解变量在计算机内存中的表示也非常重要。

Python解释器做了两件事情:
(1)在内存中创建了一个'ABC'的字符串。
(2)在内存中创建了一个名为a的变量,并把它指向'ABC',如图2-1所示。

图2-1 a变量指向'ABC'
也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据。例如下面的代码:

最后一行打印出变量b的内容到底是'ABC',还是'XYZ'?如果从数学意义上理解,就会错误地得出b和a相同,也应该是'XYZ',但实际上b的值是'ABC'。下面分析一下执行过程:
执行a = 'ABC',Python解释器创建了字符串'ABC'和变量a,并把a指向'ABC'。
执行b = a,解释器创建了变量b,并把b指向a指向的字符串'ABC',如图2-2所示。
执行a = 'XYZ',解释器创建了字符串'XYZ',并把a指向'XYZ',但b没有更改,如图2-3所示。

图2-2 a、b变量都指向'ABC'

图2-3 a变量指向'XYZ'
所以,最后打印变量b的结果自然是'ABC'。
内置的type()函数可以用来查询变量的数据类型。

当变量不再需要时,Python会自动回收内存空间,也可以使用del语句删除一些变量。
del语句的语法:

可以通过使用del语句删除单个或多个变量对象。例如:

2.2.2 常量
所谓常量就是不能变的变量,例如,常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:

但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变。所以,用全部大写的变量名表示常量只是一个习惯上的用法,实际上可以改变变量PI的值。