Python 3.8从零开始学
上QQ阅读APP看书,第一时间看更新

2.3.1 变量

把一个值赋值给一个名字,这个值会存储在内存中,这块内存就称为变量。在大多数语言中,把这种操作称为“给变量赋值”或“把值存储在变量中”。

比如,Python快乐学习班的同学乘坐“集合号”大巴出去游玩,大巴是一个实实在在存在的物体,要占据空间,而“集合号”是我们给它的一个名字,这个名字可以更改为“空间一号”或是其他。在这里,大巴相当于值,“集合号”相当于变量。

在Python中,变量指向各种类型值的名字,以后再用到这个值时,直接引用名字即可,不用再写具体的值。比如对Python快乐学习班的同学说上“集合号”了,读者就都知道要上大巴了。

变量的使用环境非常宽松,没有明显的变量声明,而且类型不是必须固定。可以把一个整数赋值给变量,也可以把字符串、列表或字典赋给变量。比如这里“集合号”指的是一辆大巴,但我们同样可以用“集合号”指代一艘船、一架飞机或一栋建筑等。

那什么是赋值呢?

在Python中,赋值语句用等号(=)表示,可以把任意数据类型赋值给变量。比如,要定义一个名为xiaomeng的变量,对应值为XiaoMeng,可按下述方式操作:

>>> xiaohong='XiaoHong'
>>>

提示


字符串必须以引号标记开始,并以引号标记结束。

此操作解释:xiaomeng是我们创建的变量,=是赋值语句,XiaoMeng是变量值,变量值需要用单引号或双引号标记。整句话的意思是:创建一个名为xiaomeng的变量并给变量赋值为XiaoMeng(注意这里的大小写)。

这里读者可能会疑惑,怎么前面输入后按回车键就能输出内容,而在上面的示例中按回车键后没有任何内容输出,只是跳到输入提示状态下。

在Python中,对于变量,不能像数据类型那样,输入数值就立马能看到结果。对于变量,需要使用输出函数。还记得前面讲的print()吗?print()是输出函数,上面的示例中没有使用输出函数,屏幕上当然不会有输出内容。要有输出应该怎么操作呢?我们尝试如下:

>>> print(xiaohong)
XiaoHong

成功打印出了结果。但为什么输入的是print(xiaomeng),结果却输出XiaoMeng呢?这就是变量的好处,可以只定义一个变量名,比如名为xiaomeng的变量,把一个实际的值赋给这个变量,比如实际值XiaoMeng,计算机中会开辟出一块内存空间存放XiaoMeng这个值,当我们让计算机输出xiaomeng时,在计算机中,xiaomeng这个变量实际上指向的是值为XiaoMeng的内存空间。就像对Python快乐学习班的同学说“集合号”,Python快乐学习班的同学们就知道那指的是他们乘坐的大巴。

在使用变量前需要对其赋值。没有值的变量是没有意义的,编译器也不会编译通过。这就如你碰见一个人就对他说“集合号”,别人肯定会以为你是疯子。

例如,定义一个变量为abc,不赋任何值,输入及结果如下:

>>> abc
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'abc' is not defined

输出结果解释:提示我们名称错误,名称abc没有定义。

同一个变量可以反复赋值,而且可以是不同类型的变量,输入如下:

>>> a=123
>>> a
123
>>> a='ABC'
>>> print(a)
ABC

这种变量本身类型不固定的语言称为动态语言,与动态语言对应的是静态语言。静态语言在定义变量时必须指定变量类型,对静态语言赋值时,赋值的类型与指定的类型不匹配就会报错。和静态语言相比,动态语言更灵活。

这里提到变量类型的概念,在2.2节提到Python 3中有6种标准对象类型,那么,对于定义的一个变量,怎么知道它的类型是什么?

在Python中,提供了一个内置的type函数帮助识别一个变量的类型,如在交互模式下输入:

>>> type('Hello,world!')
<class 'str'>

这里的<class 'str'>指的是Hello这个变量值的类型是str(字符串)类型的。

按同样方式,可以测试50这个值的类型是什么。在交互模式下输入:

>>> type(50)
<class 'int'>

计算机反馈的结果类型是整型(int)。再继续测试5.0的类型是什么:

>>> type(5.0)
<class 'float'>

计算机反馈的结果类型是浮点型(float)。再继续测试test type的类型是什么:

>>> a='test type'
>>> type(a)
<class 'str'>

计算机反馈的结果类型是字符串类型(str)。

只要是用双引号或单引号括起来的值,都属于字符串。在交互模式下输入:

>>> type('test single quotes')
<class 'str'>
>>> type("test double quote")
<class 'str'>
>>> type("100")
<class 'str'>
>>> type("3.0")
<class 'str'>
>>> b='3'
>>> type(b)
<class 'str'>
>>> b='100'
>>> type(b)
<class 'str'>
>>> c='3.0'
>>> type(c)
<class 'str'>

计算机反馈的结果类型都是字符串类型(str)。

注意不要把赋值语句的等号等同于数学中的等号。比如对于下面的两行代码:

a=100
a=a + 200

这里同学们可能会有疑问,a=a + 200是什么等式?这个从以前的学习经验来看是不成立的,在计算机里面怎么就成立了。这里首先要声明,计算机不是人脑,在很多事情的处理上,计算机并不遵循我们眼睛看到的那种规则,计算机有计算机的思维逻辑。

在编程语言中,a=a + 200的计算规则是:赋值语句先计算右侧的表达式a + 200,得到结果300,再将结果值300赋给变量a。由于a之前的值是100,重新赋值后,a的值变成300。我们通过交互模式做验证,输入如下:

>>> a=100
>>> a=a + 200
>>> print(a)
300

由输出结果看到,所得结果和前面推理结果一致。

理解变量在计算机内存中的表示也非常重要。在交互模式下输入:

>>> a='123'

这时,Python解释器做了两件事情:

(1)在内存中开辟一块存储空间,这个存储空间中存放'123'这三个字母对应的字符串。

(2)在内存中创建了一个名为a的变量,并把它指向'123'字符串对应的内存空间。

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:

>>> a='123'
>>> b=a
>>> a='456'
>>> print(b)

最后一行打印出变量b的内容到底是'123'还是'456'呢?如果从数学逻辑推理,得到的结果应该是b和a相同,都是'456',但是实际上,继续往下走,会看到交互模式下打印出的b的值是'123'。

当然,这里我们不急于问为什么,先一行一行执行代码,看看到底是怎么回事。

首先执行a='123',解释器在内存中开辟一块空间,存放字符串'123',并创建变量a,把a指向'123',如图2-3所示。

接着执行b=a,解释器创建了变量b,并把b也指向字符串'123',如图2-4所示,此时a和b都指向了字符串'123'。

再接着执行a='456',解释器在内存中继续开辟一块空间,开辟的新空间用于存放字符串'456',a的指向更改为字符串'456',b的指向不变,如图2-5所示。

图2-3 a指向'123'

图2-4 a、b指向'123'

图2-5 a指向'456',b不变

最后执行print(b),输出变量b的结果,由图2-5可见,变量b指向的是字符串'123',所以print(b)得到的结果是123。