2.3 变量和关键字
编程语言最强大的功能之一是操纵变量。变量(variable)是一个需要熟知的概念,如果你觉得数学让你抓狂,别担心,Python中的变量很好理解。变量基本上代表某个值的名字。
2.3.1 变量
变量指向各种类型值的名字,以后再用到这个值时,直接引用名字即可,不用再写具体的值。在Python中,变量的使用环境非常宽松,没有明显的变量声明,而且类型不是固定的。你可以把一个整数赋值给变量,如果觉得不合适,把字符串赋给变量也可以。
在Python中,等号(=)是赋值语句,可以把任意数据类型赋值给变量。
如果要定义一个名为xiaohong的变量,该怎么操作呢?输入如下:
>>> xiaohong='XiaoHong' >>>
提 示
字符串必须以引号标记开始,并以引号标记结束。
此操作解释:xiaohong是我们创建的变量,=是赋值语句,XiaoHong是变量值,需要用引号标记。整句话的意思为:创建变量xiaohong并赋值为XiaoHong。
小萌疑惑了,怎么前面输入后按回车键就能输出内容,这里怎么跳到输入提示状态呢?别急,还记得前面讲的print()吗?print()是输出函数,看看这里,没有使用输出函数,屏幕上当然不会输出内容了。要输出内容应该怎么操作呢?我们尝试一下:
>>> print(xiaohong) XiaoHong
不错,尝试成功了。但为什么小萌输入的是print(xiaohong),结果却输出XiaoHong呢?这就是变量的好处,可以只定义一个变量,比如xiaohong,把一个值赋给这个变量,比如XiaoHong,这样当我们输出xiaohong时,实际上输出的是XiaoHong。
在使用变量前需要对其赋值。没有值的变量是没有意义的,编译器也不会编译通过。例如,定义一个变量为abc,不赋任何值,输入及结果如下:
>>> abc Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'abc' is not defined
同一个变量可以反复赋值,而且可以是不同类型的变量,输入如下:
>>> a = 123 >>> a 123 >>> a='ABC' >>> print(a) ABC
这种变量本身类型不固定的语言称为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值时类型不匹配就会报错。和静态语言相比,动态语言更灵活。
当不能确定变量或数据的类型时,可以借助解释器内置的函数type进行确认。在交互模式下输入如下:
>>> type('Hello,world!') <class 'str'>
测试得到输入的结果类型是字符串类型(str)。
>>> type(100) <class 'int'>
测试得到输入的结果类型是整型(int)。
>>> type(3.0) <class 'float'>
测试得到输入的结果类型是浮点型(float)。
>>> a='test type' >>> type(a) <class 'str'>
测试得到输入的结果类型是字符串类型(str)。
>>> b=100 >>> type(b) <class 'int'>
测试得到输入的结果类型是整型(int)。
>>> c=3.0 >>> type(c) <class 'float'>
测试得到输入的结果类型是浮点型(float)。
只要是用双引号或单引号括起来的值,都属于字符串。在交互模式下输入:
>>> 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+200,得到结果300,再赋给变量a。由于a之前的值是100,重新赋值后,a的值变成300。我们通过交互模式验证,输入如下:
>>> a=100 >>> a=a+200 >>> print(a) 300
和我们所描述的结果一致。
理解变量在计算机内存中的表示也非常重要。当我们输入如下:
>>> a='ABC'
这时,Python解释器做了两件事情:
(1)在内存中创建了一个'ABC'字符串。
(2)在内存中创建了一个名为a的变量,并把它指向'ABC'。
也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:
>>> a='ABC' >>> b=a >>> a='XYZ' >>> print(b)
最后一行输出变量b的内容到底是'ABC'还是'XYZ'呢?如果从数学意义上理解,就会错误地得出b和a相同,应该是'XYZ'。实际上,b的值是'ABC'。我们一行一行地执行代码,就可以看到到底发生了什么事。
执行a='ABC',解释器创建了字符串'ABC'和变量a,并把a指向'ABC',如图2-3所示。
图2-3 a指向'ABC'
执行b=a,解释器创建了变量b,并把b指向a指向的字符串'ABC',如图2-4所示。
图2-4 a、b指向'ABC'
执行a='XYZ',解释器创建了字符串'XYZ',并把a的指向改为'XYZ',但b没有更改,如图2-5所示。
图2-5 a指向'XYZ',b不变
最后输出变量b的结果自然是'ABC'了。
2.3.2 变量名称
程序常常选择有意义的名称作为变量名,以此标记变量的用途。
变量名是由数字或字符组成的任意长度的字符串,必须以字母开头。使用大写字母是合法的,但变量名建议使用小写字母开头。Python是区分大小写的。举个例子来说,Name和name是两个不同的变量名。在交互模式下输入如下:
>>> name='study python is happy' >>> Name='I agree with you' >>> print(name) study python is happy >>> print(Name) I agree with you
下画线“_”可以出现在变量名中,经常用于连接多个词组,如happy_study、do_it_with_more_practice。在交互模式下输入如下:
>>> happy_study='stay hungry stay foolish' >>> print(happy_study) stay hungry stay foolish
如果给变量取非法的名称,解释器就会显示语法错误。请看下面的示例:
>>> 2wrongtest='just for test' File "<stdin>", line 1 2wrongtest='just for tes ^ SyntaxError: invalid syntax
该示例提示语法错误,错误信息为无效的语法,原因为不是以字母开头的。
>>> xiaoming@me='surprised' File "<stdin>", line 1 SyntaxError: can't assign to operator
该示例提示语法错误,错误信息为不能做指定操作,原因是包含一个非法字符@。
Python不允许使用关键字作为变量名,请看下面的例子:
>>> from='from' File "<stdin>", line 1 from='from' ^ SyntaxError: invalid syntax
from是Python的一个关键字,因此出现错误。
Python 3中共有33个关键字,都不能作为变量名来使用。
False None True and as assert break class continue def del elif else except finally for from global if import in nonlocal lambda is not or pass raise return try while with yield