1. 变量基础

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

变量 = 对象

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

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

上述代码分别给 3 个值对象 3.14hello world2 起了不同的名字 PIsival , 即定义了变量。

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

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

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

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

>>> print(radius) # radius 是未定义的
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'radius' is not defined

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

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

>>> a=1000
>>> b=1000
>>> print(a==b)
True
>>> print(a is b)
False

TrueFalsePythonbool(布尔)类型的两个值 , 分别表示“真”和“假”。这里 , a==b 比较的结果值是 True , 即“真” , 也就是说 , ab 的值是相等的。而 a is b 判断的结果值是 False , 即“假” , 也就是说 , ab 不是同一个对象。 可以首先用函数 type()得到 a == b 的类型 , 然后用函数 print()输出这个类型。例如:

>>> print(type(a==b))
<class 'bool'>
>>> print(type(a is b))
<class 'bool'>

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

>>> print(id(a))
2296459534832
>>> print(id(b))
2296459534480

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

2. 变量名和关键字

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

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

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

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


熊熊