
1.3.1 变量和赋值的意义
编程软件中的变量(variable)和赋值操作是代码用得最多的符号和操作,变量可以理解成存储数据的一个符号。Python中可以让同一个变量在不同时刻代表不同类型的数据,但不能同时代表多个数据,只能同时代表一个数据。
在Python的Shell中输入如下代码。第1行和第2行中,用变量a和变量b分别存储数字2和5,c存储1+3计算后的值,即4,通过第4行的print()函数输出a、b和c的值,从第5行中print()函数的返回值可以看出a、b和c的值分别是2、5和4。代码中的“=”表示赋值,将“=”右边的值或者表达式的值赋给“=”左边的变量。初学编程的人员可以简单地把“=”理解成“=”左边的变量等于“=”右边的值或表达式的值。

其实对于赋值运算“=”,计算机内部有更深入的操作,对于第1句a=2和第2句b= 5,计算机处理这两句赋值运算是先在内存中开辟两个空间,分别记录数值2和5,然后把记录数值2和记录数值5的内存空间的起始地址分别赋予变量a和b;对于第3句c=1+3,是先在内存中开辟两个空间,分别记录数值1和3,然后把1和3读入CPU中,进行1+3运算,得到结果4,然后再在内存中开辟一个新的空间,把4输出到这个新空间中,最后把4所在的内存空间的起始地址赋值给变量c,第4行的print(a,b,c)函数是通过a、b、c所记录的内存地址,从内存中读取对应地址的值并输出。
对于内存中存储的数据的起始地址可以通过id()函数获取。在Shell中继续输入如下代码,可以看出数值2和变量a的内存地址是相同的,数值5和变量b的内存地址是相同的,数值4和变量c的内存地址也是相同的。

在Shell中继续输入如下代码。其中第12行代码为a= a+6,在前面的第1行中已经将2赋予了变量a,计算a=a+6是先计算“=”右边的a+6,得到8,然后将8重新赋值给a,a的值变成了8,由第13行和第14行可以看出a的值是8,已经不是2了。第12行a=a+6的计算过程是,先在内存中开辟一个空间存储6,然后把变量a指向的内存空间的值(这个值是2)和内存空间中的6读入CPU中,进行2+6的计算,得到结果8,然后再在内存空间中开辟一个空间,把结果8存储到这个新空间中,通过赋值操作“=”,将结果8的存储地址赋给变量a,变量a已经不指向2的存储地址,所以a的值最后是8,通过第15行和第16行的代码可以看出,8和a的地址是相同的。第17行代码a=a+b+c,先计算赋值操作“=”右边的表达式a+b+c的值,由于a指向8,b指向5,c指向4,CPU从内存中读取8、5和4,完成8+5+4的计算,将结果17保存在内存中。通过赋值操作,将a重新指向结果17的内存地址,通过第20行代码和第21行的返回值可以看出,变量a和数值17的地址是相同的。
