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