保留字(又称关键字)是Python语言中已经被赋予特定意义的一些单词,开发程序时,不可以把这些保留字作为变量、函数、类、模块和其他对象的名称来使用。Python中的保留字可以通过在IDLE中输入如例2-2所示的两行代码查看。
【例2-2】 通过keyword查看Python中的保留字。
运行结果:
Python中所有保留字是区分字母大小写的。例如,True、if是保留字,但是TURE、IF就不属于保留字。
如果在开发程序时,使用Python中的保留字作为模块、类、函数或者变量等的名称,则会提示“invalid syntax”的错误信息。
标识符用于标识Python语言元素中的变量、函数、类、模块或其他对象的名称,通俗地讲就是名字。
Python合法的标识符必须遵守以下规则。
1)标识符由一串字符组成,必须以下划线(_)或字母开头,后面接任意数量的下划线、字母(a~z,A~Z)或数字(0~9)。Python 3.x支持Unicode字符,所以汉字等各种非英文字符也可以作为变量名。例如:_abs、r_l、X、var1、FirstName、高度等,都是合法的标识符。
注意:在Python语言中允许使用汉字作为标识符,如“我的大学=”中国农业大学””,在程序运行时并不会出错误,但建议读者尽量不要使用汉字作为标识符。
2)在Python中,标识符中的字母是严格区分大小写的,两个同样的单词,如果大小写格式不一样,所代表的意义是完全不同的。Sum和sum是两个不同的标识符。
3)禁止使用Python保留字(或称关键字)作为标识符。标识符不能与保留字同名。保留字是被Python保留起来具有特殊含义的词,不能再用于起名字。
4)Python中以下划线开头的标识符有特殊意义,一般应避免使用相似的标识符。
● 以单下划线开头的标识符(_width)表示不能直接访问的类属性。另外,也不能通过“from xxx import*”导入。
● 以双下划线开头的标识符(如__add)表示类的私有成员。
● 以双下划线开头和结尾的是Python里专用的标识,例如,“__init__()”表示构造函数。
● 开头字符不能是数字。
● 标识符中唯一能使用的标点符号只有下划线,不能含有其他标点符号(包括空格、括号、引号、逗号、斜线、反斜线、冒号、句号、问号等)以及@、%和$等特殊字符。例如:stu-score、First Name、2班平均分等都是不合法的标识符。
在Python中,变量严格意义上应该称为“名字”,也可以理解为标签。当把一个值赋给一个名字时(如把值“不忘初心”赋给strslogan),strslogan就称为变量。在大多数编程语言中,都称之为“把值存储在变量中”。意思是在计算机内存中的某个位置,程序执行时字符串序列“不忘初心”已经存在于计算机的内存。不需要知道它们到底在哪里,只需要告诉Python的编译器,字符串序列的名字是strslogan,然后就可以通过这个名字来引用这个字符串序列了。
结合生活中的实际例子可以这样理解,定义和使用变量的过程就像快递员取快递一样,内存就像一个巨大的货物架,在Python中定义变量就如同给快递盒子贴标签。快递存放在货物架上,上面附着写有客户名字的标签。当客户来取快递时,并不需要知道它们存放在这个大型货架的具体位置,只需要客户提供自己的名字,快递员就会把快递交给客户。变量也一样,不需要准确地知道信息存储在内存中的位置,只需要记住存储变量时所用的名字,使用这个名字就可以找到信息。
(1)定义变量
在Python中,不需要先声明变量名及其类型,直接赋值即可创建各种类型的变量。但是变量的命名并不是任意的,应遵循以下5条规则。
1)变量名必须是一个有效的标识符。
2)变量名不能使用Python中的保留字。
3)慎用小写字母l和大写字母O。
4)应选择有意义的单词作为变量名,即见名知意。
为变量赋值可以通过等号(=)来实现,其语法格式为:
例如:
变量必须定义之后才能访问。Python中的变量比较灵活,同一个变量名称可以先后被赋予不同类型的值,定义为不同的变量对象参与计算。
这样创建的变量就是数值型的变量。如果直接为变量赋值一个字符串值,那么该变量即为字符串类型。例如下面的语句:
在Python中,允许同时为多个变量赋值,比如a=b=c=1,表示创建一个整型对象,三个变量被分配到相同的内存空间上。还可以为多个对象指定多个变量,比如:a,b,c=11,23,’python’。
在Python语言中,数据表示为对象。对象本质上是一个内存块,拥有特定的值,支持特定类型的运算操作。在Python 3中,一切皆为对象。Python语言中的每个对象由标识(Identity)、类型(Type)和值(Value)标识。
1)标识用于唯一地表示一个对象,通常对应对象在计算机内存中的位置,换句话说变量是存放变量位置的标识符。使用内置函数id(obj)可以返回对象obj的标识。
变量赋值对于内存的使用情况如下。
● 变量fruit_01赋值“苹果”,代码如下。
其内存的分配情况如图2-1所示。
图2-1 变量赋值内存分配情况(1)
● 变量fruit_01赋值“苹果”,变量fruit_02赋值“香蕉”,代码如下。
其内存的分配情况如图2-2所示。
图2-2 变量赋值内存分配情况(2)
● 变量fruit_01赋值“苹果”,变量fruit_02的值等于fruit_01,代码如下。
其内存的分配情况如图2-3所示。
图2-3 变量赋值内存分配情况(3)
2)类型用于标识对象所属的数据类型(类),数据类型用于限定对象的取值范围以及允许执行的处理操作。使用内置函数type(obj)可以返回对象obj所属的数据类型。
3)值用于表示对象的数据类型的值。使用内置函数print(obj)可以返回对象obj的值。
Python是一种动态类型的语言,也就是说,变量的类型可以随时变化。在Python语言中,使用内置函数type可以返回变量类型。
【例2-3】 使用内置函数type、id和print查看对象。
显示结果:
上述例子中,创建变量myvalue,并赋值为字符串“学习强国”,然后输出该变量的类型,可以看到该变量为字符串类型,再将变量赋值为数值123,并输出该变量的类型,可以看到该变量为整型。
Python也是一种强类型语言,每个变量指向的对象均属于某个数据类型,即支持该类型运行的操作运算。当允许多个变量指向同一个值,使用内置函数id可以返回变量所指的内存地址。例如,将两个变量都赋值为数字2048,再分别应用内置函数id获取变量的内存地址,将得到相同的结果。
【例2-4】 两个变量赋同样的值,验证指向的地址。
运行结果:
特别提醒,不同的机器,运行时显示的id的值有可能不同。
(2)删除变量
使用del命令可以删除一个对象(包括变量、函数等),删除之后就不能再访问这个对象了,因为它已经不存在了。当然,也可以通过再次赋值重新定义变量。
变量是否存在,取决于变量是否占据一定的内存空间。当定义变量时,操作系统将内存空间分配给变量,该变量就存在了。当使用del命令删除变量后,操作系统释放了变量的内存空间,该变量也就不存在了。
当对象绑定给变量时,计数增加1,当变量解除绑定时,计数减少1。待计数为0时,对象自动释放。Python具有垃圾回收机制,当一个对象的内存空间不再使用(引用计数为0)后,这个内存空间就会被自动释放。所以Python不会像C那样发生内存泄漏而导致内存不足甚至系统死机的现象。Python的垃圾空间回收是系统自动完成的,而del命令相当于程序主动地进行空间释放,将其归还给操作系统。
(3)变量的引用
变量本身是通用的。Python的变量实质是引用,其逻辑如图2-4所示。Python的变量都可以看成是对内存中某个对象的引用,即变量指向该内存地址存储的值。
图2-4 变量引用的逻辑示意图
通过上图可以看出,变量把对象和自己连接起来(指针连接对象空间),建立了变量和对象之间的映射关系,这就是引用。引用完成,就实现了赋值。变量是到内存空间的一个指针;对象是一块内存空间,内存空间里存储对象所表示的值;引用是自动形成的从变量到对象的映射关系(指针)。
(4)变量修改赋值
Python变量可以通过赋值来修改变量的“值”,但并不是原地址修改。例如,变量x先被赋值为1,然后又被赋值为1.5之后的逻辑如图2-5所示。
图2-5 变量修改赋值的逻辑示意图
由图2-5中可见,并不是x的值由1变成了1.5,而是另外开辟了一个地址空间存储对象,让x指向它。变量的值并不是直接存储在变量里,而是以“值”对象的形式存储在内存某地址中。可以说变量指向那个“值”对象。因此,Python变量里存放的实际是“值”对象的位置信息(内存地址)。这种通过地址间接访问对象数据的方式,称为引用。
使用id函数可以确切地知道变量引用的内存地址,使用运算符is可以判断两个变量是否引用同一个对象。
【例2-5】 运算符is可以判断两个变量是否引用同一个对象。
运算结果:
显然,a和b都赋值为相同的小整数或者短字符串时,两个变量所引用的是同一个对象。这也被称为“驻留机制”。这是Python为提高效率所做的优化,节省了频繁创建和销毁对象的时间,也节省了存储空间。但是,当两个变量赋值为相同的大整数或者长字符串时,默认引用的是两个不同的对象,不过可以利用变量之间的赋值来让两个变量引用相同的对象。
在Python语言中,通过“==”运算符可以判断两个变量指向的对象值是否相同;通过“is”运算符可以判断两个变量是否指向同一对象。
常量就是程序运行过程中值不能改变的量,比如现实生活中的居民身份证号码、数学运算中的圆周率等,这些数值都是不会发生改变的,它们都可以定义为常量。
在Python中,并没有提供定义常量的保留字,但是在PEP 8规范中规定了常量由大写字母和下划线组成。在实际项目中,常量首次赋值后还是可以被其他代码修改的。比如:PI=3.14。