2.3 Python的基本运算和表达式
2.3.1 变量
1.变量的赋值和存储
(1)变量定义
在Python中没有专门的变量定义语句,变量定义是通过对变量第一次进行赋值来实现的。
【例2-3】变量定义示例。
变量必须定义之后才能访问。Python中的变量比较灵活,同一个变量名称可以先后被赋予不同类型的值,定义为不同的变量对象参与计算。在上面的例子中,x一开始是整型变量,之后又变成了浮点型变量。
(2)删除变量
使用del命令可以删除一个对象(包括变量、函数等),删除之后就不能再访问这个对象了,因为它已经不存在了。当然,也可以通过再次赋值重新定义x变量。
变量是否存在,取决于变量是否占据一定的内存空间。当定义变量时,操作系统将内存空间分配给变量,该变量就存在了。当使用del命令删除变量后,操作系统释放了变量的内存空间,该变量也就不存在了。
Python具有垃圾回收机制,当一个对象的内存空间不再使用(引用计数为0)后,这个内存空间就会被自动释放。所以Python不会像C那样发生内存泄漏而导致内存不足甚至系统死机的现象。Python的垃圾空间回收是系统自动完成的,而del命令相当于程序主动地进行空间释放,将其归还给操作系统。
(3)变量引用
Python的变量实质是引用,其逻辑如图2-2所示。
图2-2 变量引用的逻辑示意图
(4)变量修改赋值
Python变量可以通过赋值来修改变量的“值”,但并不是原地址修改。例如,变量x先被赋值为1,然后又被赋值为1.5之后的逻辑如图2-3所示。
图2-3 变量修改赋值的逻辑示意图
由图2-3中可见,并不是x的值由1变成了1.5,而是另外开辟了一个地址空间存储对象,让x指向它。变量的值并不是直接存储在变量里,而是以“值”对象的形式存储在内存某地址中。我们可以说变量指向那个“值”对象。因此,Python变量里存放的实际是“值”对象的位置信息(内存地址)。这种通过地址间接访问对象数据的方式,称为引用。
使用id()函数可以确切地知道变量引用的内存地址,使用运算符is可以判断两个变量是否引用同一个对象。例如:
显然,x和y都赋值为相同的小整数或者短字符串时,两个变量所引用的是同一个对象。这也被称为“驻留机制”。这是Python为提高效率所做的优化,节省了频繁创建和销毁对象的时间,也节省了存储空间。但是,当两个变量赋值为相同的大整数或者长字符串时,默认引用的是两个不同的对象,例如:
我们可以利用变量之间的赋值,来让两个变量引用相同的对象。例如:
2.变量类型的转换
Python是强类型语言。当一个变量被赋值为一个对象后,这个对象的类型就固定了,不能隐式转换成另一种类型。当运算需要时,必须使用显式的变量类型转换。例如input()函数所获得的输入值总是字符串,有时需要将其转换为数值类型,方能进行算术运算。例如:
变量的类型转换并不是对变量原地进行修改,而是产生一个新的预期类型的对象。
Python以转换目标类型名称提供类型转换内置函数。
(1)float()函数。将其他类型数据转换为浮点数,例如:
(2)str()函数。将其他类型数据转换为字符串,例如:
从上述最后两个例子我们可以看出,Python会尽可能转换成字符串长度较短的形式,以节省空间。
(3)int()函数。将其他类型数据转换为整型,例如:
(4)round()函数。将浮点型数值圆整为整型,例如:
圆整计算总是“四舍”,但并不一定总是“五入”。因为总是逢五向上圆整会带来计算概率的偏差。所以,Python采用的是“银行家圆整”:将小数部分为.5的数字圆整到最接近的偶数,即“四舍六入五留双”。
(5)bool()函数。将其他类型数据转换为布尔类型,例如:
(6)chr()和ord()函数。进行整数和字符之间的相互转换:chr()将一个整数按ASCII码转换为对应的字符,ord()是chr()的逆运算,把字符转换成对应的ASCII码或Unicode值。例如: