Python3从入门到实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 变量

2.2.1 什么是变量

上述的hello world、3.14、2都是具体的值对象,也称为“字面量”。为了便于在程序代码中引用这些对象,可以给它们起名字,这些名字就称为“变量”,即可以定义一个变量引用这个对象。定义一个变量的格式是:

变量名=对象

变量名后跟一个等号=,等号后面是该变量引用的对象。定义变量的这个等号=也称赋值运算符,其真正含义不是给这个变量一个值,而是说明这个变量引用哪个对象,仅仅是这个对象的1个名字而已。例如:

#变量就是对象的名字,也称为对象的引用
PI=3.14;
s="hello world"
ival=2;
print(ival) #打印变量ival引用的对象2
print(PI)
print(s)

输出:

2
3.14
hello world

上述代码分别给3个值对象3.14、hello world和2起了不同的名字PI、s、ival,即定义了变量。

变量对象的引用:变量本身并不存储具体数值,它们仅是对象的引用。可以用赋值运算符=修改变量引用的对象,使变量引用其他对象。例如:

PI=ival   # PI修改为ival引用对象的引用,即PI和ival都引用了整数对象2
print(PI, ival)
print(id(PI), id(ival))

输出:

2 2
14958873601495887360

因此,变量PI和ival都是同一个对象的2个不同名字而已,PI=ival赋值前后如图2-1所示。

图2-1 PI=ival赋值前后

不能使用一个未定义的变量(未说明引用哪个对象)。例如:

print(radius)# radius是未定义的

将产生NameError(名字错误)的语法错误:

NameError           Traceback(most recent call last)
<ipython-input-3-d01a0099d01e> in <module>()
----> 1 print(radius)  # radius是未定义的
NameError: name 'radius' is not defined

Python中有两个运算符==和is,前者用于比较对象的值是否相等,后者用于判断两个对象是否为同一个。例如:

a=1000
b=1000
print(a==b)
print(a is b)

输出:

True
False

TrueFalse是Python的bool(布尔)类型的两个值,分别表示“真”和“假”。这里,a==b比较的结果值是True,即“真”,也就是说,a和b的值是相等的。而a is b判断的结果值是False,即“假”,也就是说,a和b不是同一个对象。

可以首先用函数type()得到a==b的类型,然后用函数print()输出这个类型。例如:

print(type(a==b))
print(type(a is b))

输出:

<class 'bool'>
<class 'bool'>

可以用函数id()得到a、b的内存地址。例如:

print(id(a))
print(id(b))

输出:

1524446335088
1524446335280

由此说明a和b确实是两个不同的对象,它们占据的内存块地址是不同的。

2.2.2 变量名和关键字

可以给变量起任意的名字,但为了方便阅读和理解程序,变量名应该尽量直观易懂。例如,应使用“PI”而不应用“sdfduzwlf2”来表示圆周率。Python语言和其他编程语言一样,变量名只能包含字母、数字和下画线,且不能以数字开头。同时,变量名不能和已经被Python语言使用的名字(关键字)相同。例如,不能定义def为变量名,因为def是Python用于定义函数的关键字。

80ui=23
A$2=11.2
class="hello"

上面的三个变量名都是非法的(invalid)。其中,class是Python用于定义类的关键字。

2.2.3 动态类型语言

在静态类型语言,如C语言中,定义变量时必须指明其数据类型,例如:

int i=3;

数据类型规定了这种类型的变量占据多大的内存空间,数值的内容和取值范围,以及对这种类型的变量(数据)能进行什么样的运算。编译器会根据变量的类型为它分配适合的内存空间,检查其初始值是否合法,是否能进行某种运算。例如,编译器在编译下面的C语言代码时会报错:

int j="hello";     //错:不能将一个字符串赋值给int整型变量
double a, b;
a=a%b;             //错:对于double类型的数据不能执行取余运算%

在静态类型语言中,变量是一块具有确定类型的内存的名字,一旦定义了该变量,则在销毁该变量前,其变量名始终指向这块内存。

与静态类型语言不同,Python是一个动态类型语言,变量名仅是一个对象的名字,并不是占据一块内存的那个对象本身,一个变量名可以随时指向不同的对象,直到程序运行时,才能根据其指向的对象知道该对象的数据类型。例如:

s="hw-dong"         #s指向的对象"hw-dong"是一个str类型
s=3.14             #s指向的对象3.14是一个float类型

总结

● 通过赋值运算符=将一个对象赋值给一个变量名用于定义一个变量。

● 变量仅是对象的名字,或者说,变量引用了对象。一个对象既可以对应多个变量(名),也可以随时用赋值运算符=使一个变量(名)指向另外的对象,即变量不会“从一而终”。

● 可以用等于运算符==判断两个对象的值是否相等,用 is 运算符判断两个对象是否为同一个对象。当然,也可以用函数print()打印两个对象的id,查看它们是否是同一个对象。

● 变量名只能包含字母、数字和下画线,且不能以数字开头,更不能与Python关键字相同。

● Python是动态类型语言,只有运行时根据变量引用的对象才能知道这个对象的数据类型。