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
True和False是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是动态类型语言,只有运行时根据变量引用的对象才能知道这个对象的数据类型。