Python 变量
(1)变量的数据类型
一般而言,变量需要先定义,后使用,变量的数 据类型决定了变量占用多少个字节的内存单元。
例:C 语言中的变量,需要在程序编译时确定数 据类型并分配相应的内存单元。这种在使用变量 之前定义其数据类型的语言称为静态类型语言。
但Python 语言不同,它是一种动态类型语言。
Python 是一种动态类型语言。
这种动态类型语言确定变量的数据类型是在给变 量赋值的时候,对变量的每一次赋值,都可能改 变变量的类型。
在Python 中使用变量时不用像C 语言那样先定义 数据类型,而可直接使用。
例:
>>> x=12 #给变量x 赋值
>>> y=12.34 #给变量y 赋值
>>> z='Hello World' #给变量z 赋值
>>> print(x,y,z)
12 12.34 Hello World
可以使用Python 内置函数type()来查询变量的类型。
例:
>>> type(x) #查看x 的数据类型,x 是整型(int)变量
(class 'int')
>>> type(y) #查看y 的数据类型,y 是浮点型(float) 变量
(class 'float')
>>> type(z) #查看z 的数据类型,z 是字符串型(string) 变量
(class 'str')
(2)变量与地址的关系
在C 语言中,编译系统要为变量分配内存空间, 当改变变量的值时,改变的是该内存空间的内容, 在程序运行过程中,变量的地址是不再发生改变的,即变量所对应的内存空间是固定的。
Python 语言则不同,它采用的是基于值的内存管理方式,不同的值分配不同的内存空间。 当给变量赋值时,Python解释器为该值分配一个 内存空间,而变量则指向这个空间,当变量的值 被改变时,改变的并不是该内存空间的内容,而 是改变了变量的指向关系,使变量指向另一内存 空间。
这可理解为,Python 变量并不是某一个固定内存 单元的标识,而是对内存中存储的某个数据的引 用(reference),这个引用是可以动态改变的。
例:执行下面的赋值语句后,Python 在内存中创建数据12,并 使变量x 指向这个整型数据,因此可以说变量x 现在是整型数据。
>>> x=12 >>> print(x)
12
如果进一步执行下面的赋值语句,则Python 又在内存中创建数 据3.14,并使变量x 改为指向这个浮点型(实型)数据,因此 变量x 的数据类型现在变成了浮点型。

>>> x=3.14
>>> print(x)
3.14
Python 具有自动内存管理功能,对于没有任何变 量指向的值(称为垃圾数据),Python 系统会自 动将其删除。
例:当x 从指向12 转而指向3.14 后,数据12 就变 成了没有被变量引用的垃圾数据,Python会回收 垃圾数据的内存单元,以便提供给别的数据使用, 这称为垃圾回收(garbage collection)。
也可以使用del 语句删除一些对象引用。
例:
del x
删除x 变量后,如果再使用它,将出现变量未定义错(name 'x' is not defined)。
Python 的id()函数可以返回对象的内存地址。
>>> a=2.0
>>> b=2.0
>>> id(a)
35433824
>>> id(b)
35853488
>>> a=2
>>> b=2
>>> id(a)
1600796448
>>> id(b)
1600796448
Python 解释器会为每个出现的对象分配内存单元, 即使它们的值相等,也会这样。
例如,执行a=2.0,b=2.0 这两个语句时,会先后 为2.0 这个float 类型对象分配内存单元,然后将a 与b 分别指向这两个对象。所以a 与b 指向的不是同一对象。
为了提高内存利用效率,对于一些简单的对象, 如一些数值较小(-256~256)的整型(int)对象, Python 采取重用对象内存的办法。
例:执行a=2,b=2 时,由于2 作为简单的int 类型且数值小,Python 不会两次为其分配内存单元,而是只分配一次,然后将a 与b 同时指向已分配的对象。
如果赋值是较大的数值,情况就跟前面的一样了。
例:
>>> a=2222
>>> b=2222
>>> id(a)
35853872
>>> id(b)
35852800