![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=1738983302-m8Fbijc5RR1LE1P2svhSvALP012yRZpx-0-c603be77d3630875db12b21741db01c4)
变量必须定义之后才能访问。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=1738983302-zzvkADkMYynrdpPwWADfQWWXRSoTfUO3-0-7cf049b0091ee5e85527dc486d7a08cb)
图2-2 变量引用的逻辑示意图
(4)变量修改赋值
Python变量可以通过赋值来修改变量的“值”,但并不是原地址修改。例如,变量x先被赋值为1,然后又被赋值为1.5之后的逻辑如图2-3所示。
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_38.jpg?sign=1738983302-lWo9xo3eOi1TNttFqHBUpPQIav1yf6Vw-0-702707ab1a2daa303665b7846aeae148)
图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=1738983302-omzmEwDs9c2bJtKWuzFDbnzZFrAQRLim-0-d620b8b4cb083f50fa0ca1c44e81231e)
显然,x和y都赋值为相同的小整数或者短字符串时,两个变量所引用的是同一个对象。这也被称为“驻留机制”。这是Python为提高效率所做的优化,节省了频繁创建和销毁对象的时间,也节省了存储空间。但是,当两个变量赋值为相同的大整数或者长字符串时,默认引用的是两个不同的对象,例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1738983302-5G1SqpihiDaS7hwEbgHqBYeiy5bc6qsI-0-3181fbbe524fccdd3c747c1ec93a5efd)
我们可以利用变量之间的赋值,来让两个变量引用相同的对象。例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1738983302-gJFsBglkAIftLXCU48tipK35SIolvyvj-0-5d6d8cbda6670ef7c15c1d2a03cd1d62)
2.变量类型的转换
Python是强类型语言。当一个变量被赋值为一个对象后,这个对象的类型就固定了,不能隐式转换成另一种类型。当运算需要时,必须使用显式的变量类型转换。例如input()函数所获得的输入值总是字符串,有时需要将其转换为数值类型,方能进行算术运算。例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1738983302-MWpzhpcUFAqPNRctjUpgRyyHfCVCvyzr-0-d17823f53e7b3b5db944852a5eba0b7f)
变量的类型转换并不是对变量原地进行修改,而是产生一个新的预期类型的对象。
Python以转换目标类型名称提供类型转换内置函数。
(1)float()函数。将其他类型数据转换为浮点数,例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1738983302-1Hl11BprhEaWZa7Q57hq4L8O7AzZwFb0-0-54d0cbccea7074f1c65c96daa7ea3b50)
(2)str()函数。将其他类型数据转换为字符串,例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1738983302-u8vpiAjddyE2spx77Iu0dT6m5v3aYjzK-0-2fdbcddf8b6a634a2b03ccc24bd78a7d)
从上述最后两个例子我们可以看出,Python会尽可能转换成字符串长度较短的形式,以节省空间。
(3)int()函数。将其他类型数据转换为整型,例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1738983302-benjgVPHZhvsm5mzAUTT3whLdXocLg4K-0-a0cea3c839ff3fa006fe6d97587b8682)
(4)round()函数。将浮点型数值圆整为整型,例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1738983302-fbrX2v9pE6bYDMfte586Y6Kxy8NfUdzd-0-4f730875d62fca98d8000bb792f078c7)
圆整计算总是“四舍”,但并不一定总是“五入”。因为总是逢五向上圆整会带来计算概率的偏差。所以,Python采用的是“银行家圆整”:将小数部分为.5的数字圆整到最接近的偶数,即“四舍六入五留双”。
(5)bool()函数。将其他类型数据转换为布尔类型,例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1738983302-w3TZvlXngtsd6BRznrv0gibb8Moemfno-0-44e9598b920beb5c14ac83a013df006a)
(6)chr()和ord()函数。进行整数和字符之间的相互转换:chr()将一个整数按ASCII码转换为对应的字符,ord()是chr()的逆运算,把字符转换成对应的ASCII码或Unicode值。例如:
![](https://epubservercos.yuewen.com/E9F0BA/16523167304945506/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1738983302-vHhCnnGer3NKlFdiX8N6bfElw8BOFMzU-0-b61320c9dec201edf4db3f6dfecee663)