变量用于在Python程序中保存数据。在Python中,所有的数据都是对象,变量保存的是对对象的引用。
1、 变量命名规则
在Python3中,变量的命名规则如下。
- 首字符必须是下划线、英文字母或其他Unicode字符,其他字符可以是下划线、英文字母、数字或其他Unicode字符。例如,_abc、速度、r_1等都是合法的变量名,而2abc、price$则不能作为变量名。
- 变量名区分大小写。例如,Abc和abc是两个不同的变量。
- ·禁止使用Python 保留字或关键字。保留字和关键字在Python中具有特殊意义,将保留字或关键字作为变量名会导致语法错误。除了命名规则外,Python还有一些变量使用惯例。
- 首尾各有两个下划线的变量名通常为系统变量,具有特殊作用。例如,__int__、__doc__都是系统变量。
- 默认情况下,以一个或两个下划线开头的变量(如_abc)不能使用“from...import*”语句从模块导入。
- 以两个下划线开头的变量(如__abc)是类的私有变量。
2、赋值语句
赋值语句用于将数据赋值给变量。Python 支持多种格式的赋值语句:简单赋值、序列赋值、多目标赋值和增强赋值等。
1、简单赋值
简单赋值用于为一个变量赋值,示例代码如下。
x = 100
2、序列赋值
序列赋值可以一次性为多个变量赋值。在序列赋值语句中,等号左侧是用元组或列表表示的多个变量,等号右侧是用元组、列表或字符串等序列表示的数据。Python 按先后顺序依次将数据赋值给变量,示例代码如下。
>>> x,y=1,2 #直接为多个变量赋值
>>> x
1
>>> y
2
>>> (x,y)=10,20 #为元组中的变量赋值
>>> x
10
>>> y
20
>>> [x,y]=30,'abc' #为列表中的变量赋值
>>> x
30
>>> y
'abc'
当等号右侧为字符串时,Python 会将字符串分解为单个字符,依次赋值给各个变量。此时,变量个数与字符个数必须相等,否则会出错,示例代码如下。
>>> (x,y)='ab' #用字符串为元组中的变量赋值
>>> x
'a'
>>> y
'b'
>>> ((x,y),z)='ab','cd' #用嵌套的元组为变量赋值
>>> x
'a'
>>> y
'b'
>>> z
'cd'
>>> (x,y)='abc' #字符个数与变量个数不一致,出错
Traceback (most recent call last):
File "<stdin>", line 1, in cmodule>
ValueError; too many values to unpack (expected 2)
序列赋值时,可以在变量名之前使用“*”,不带“*”的变量仅匹配一个值,剩余的值作为列表赋值给带“*”的变量,示例代码如下。
>>> x,*y='abcd' #将第一个字符赋值给x,剩余字符作为列表赋值给y
>>> x
'a'
>>> y
['b','c','d']
>>> *x,y='abcd' #将最后一个字符赋值给y,其他字符作为列表赋值给x
>>> x
['a','b','c']
>>> y
'd'
>>> x,*y,z='abcde' #将第一个字符赋值给×,最后一个字符赋值给z,其他字符作为列表赋值给y
>>> x
'a'
>>> y
['b','c','d']
>>> z
'e'
>>> x,*y=[1,2,'abc',汉字'] #将第一个值赋值给×,其他值作为列表赋值给y
>>> x
1
>>> y
[2,'abc','汉字']
3、多目标赋值
多目标赋值指用连续的多个等号将同一个数据赋值给多个变量,示例代码如下。
>>> a=b=c=10 #将10赋值给变量a、b、c
>>> a,b,c
(10,10,10)
等价于:
>>> a=10
>>> b=a
>>> c=b
4、增强赋值
增强赋值指将运算符与赋值相结合的赋值语句,示例代码如下。
>>> a=5
>>> a+=10 #增强赋值,等价于a=a+10
>>> a
15
Python 中的增强赋值运算符如表所示。
+= | -= | *= | **= |
//= | &= | |= | ^= |
>>== | <<= | /= | %= |
3、变量与对象
因为Pxthon 将所有的数据都作为对象来处理,赋值语句会在内存中创建对象和变量,以下面的赋值语句为例。
x = 5
Python 在执行该语句时,会按顺序执行3个步骤:首先,创建表示整数 5的对象;其次,检查变量×是否存在,若不存在则创建变量×;最后,建立变量×与整数对象5的引用关系。
下图说明了变量×和对象-5之闻的关系。
在Python中使用变量时,必须理解下面几点。
- 变量在第一次赋值时被创建,再次出现时可以直接使用。
- 变量没有数据类型的概念。数据类型属于对象,数据类型决定了对象在内存中的存储方式。
- 变量引用对象。在表达式中使用变量时,变量立即被其引用的对象替代。所以在使用变量之前必须为其赋值。
示例代码如下。
>>> x=5 #第一次赋值,创建变量×,引用对象5
>>> print(x+3) #变量×被对象5 替代,语句实际为print(5+3)
8
4、对象的垃圾回收
当对象没有被引用时,其占用的内存空间会自动被回收——称为自动垃圾回收。Python为每一个对象创建→个计数器,记录对象的引用次数。当计数器为0时,对象被删除,其占用的内存被回收,示例代码如下。
>>> x=5 #第一次赋值,创建变量×,引用整数对象5
>>> type(x) #实际执行type(5),所以输出整数对象5的数据类型
<class 'int'>
>>> x=1.5 #使变量×引用浮点数对象1.5,对象5被回收
>>> type(x) #实际执行type(1.5)
<class 'float'>
>>> x='abc' #使变量×引用字符串对象“abc”,对象1.5被回收
>>> type(x) #实际执行type('abc')
<class 'str'>
Python 自动完成对象的垃圾回收,在编写程序时不需要考虑对象的回收问题。
可以使用del命令删除变量,释放其占用的内存资源,示例代码如下。
>>> a=[1,2,3]
>>> del a #删除变量
5、变量的共享引用
共享引用指多个变量引用了同一个对象,示例代码如下。
>>> x=5
>>> y=x #种实际执行y=5,变量y与变量×同时引用整数对象5
>>> print(x,y) #实际执行print(5,5)
5 5
>>> x=6 #变量×引用新的对象6,这不影响y对对象5的引用
>>> print(x,y) #实际执行print(6,5)
6 5
在上面的代码执行过程中,变量和对象之间的引用变化如图所示。
将变量赋值给另一个变量时,将会使两个变量引用同一个对象。为变量赋予新的值,会使变量引用新的对象,原来的引用被删除。
当变量共享引用的对象是列表、字典或类的实例对象时,如果修改了被引用对象的值,那么所有引用该对象的变量获得的将是改变之后的对象值,示例代码如下。
>>> x=[1,2,3]
>>> y=x #使y和x引用同一个列表对象[1,2,3]
>>> x
[1,2,3]
>>> y #输出结果与x的输出相同
[1,2,3]
>>> x[0]=5 #通过变量×修改列表对象的第一项
>>> x #通过变量×输出修改后的列表
[5,2,3]
>>> y #通过变量y输出修改后的列表
[5,2,3]
在上面的代码执行过程中,变量和对象之间的引用变化如图所示。
可以用is操作符来判断两个变量是否引用了同一个对象。示例代码如下。
>>> x=5
>>> a=5
>>> a is x #变量a和x引用同一个变量,结果为True
True
>>> b=a
>>> c=3
>>> a is b #变量a和b引用同一个变量,结果为True
True
>>> a is c #变量a和c引用不同变量,结果为False
False