首页 > 编程笔记 > Python笔记

Python变量的定义和使用(小白必读)

Python 中,变量严格意义上应该称为“名字”,也可以理解为标签。

程序中,当把一个值赋给一个名字时,比如把值“不忘初心”赋给 strslogan,strslogan 就称为变量。在大多数编程语言中,都称之为“把值存储在变量中”。意思是在计算机内存中的某个位置,程序执行时字符串序列“不忘初心”已经存在于计算机的内存。不需要知道它们到底在哪里,只需要告诉 Python 的编译器,字符串序列的名字是 strslogan,然后就可以通过这个名字来引用这个字符串序列了。

变量的定义

在 Python 中,不需要先声明变量名及其类型,直接赋值即可创建各种类型的变量。

注意,变量的命名并不是任意的,应遵循以下规则:
为变量赋值可以通过等号(=)来实现,其语法格式为:
变量名 = 变量值
例如:
myvalue = 123
变量必须定义之后才能访问。Python 中的变量比较灵活,同一个变量名称可以先后被赋予不同类型的值,定义为不同的变量对象参与计算。

这样创建的变量就是数值型的变量。如果直接为变量赋值一个字符串值,那么该变量即为字符串类型。例如下面的语句:
myvalue = "C语言中文网"

在 Python 中,允许同时为多个变量赋值,比如:
a=b=c=1
表示创建一个整型对象,三个变量被分配到相同的内存空间上。

还可以为多个对象指定多个变量,比如:
a,b,c=11,23,’python’
在 Python 语言中,数据表示为对象。对象本质上是一个内存块,拥有特定的值,支持特定类型的运算操作。在 Python 3 中,一切皆为对象。Python 语言中的每个对象由标识(Identity)、类型(Type)和值(Value)标识:
1、标识用于唯一地表示一个对象,通常对应对象在计算机内存中的位置,换句话说变量是存放变量位置的标识符。使用内置函数 id(obj)可以返回对象 obj 的标识。变量赋值对于内存的使用情况如下:
1) 变量 fruit_01 赋值“苹果”,代码如下:
fruit_01 = '苹果'
其内存的分配情况如下图所示。


图 1 变量赋值内存分配情况

2) 变量 fruit_01 赋值“苹果”,变量 fruit_02 赋值“香蕉”,代码如下:
fruit_01 = '苹果'
fruit_02 = '香蕉'
内存的分配情况如下图所示。


图 2 变量赋值内存分配情况

3) 变量 fruit_01 赋值“苹果”,变量 fruit_02 的值等于 fruit_01,代码如下:
fruit_01 = '苹果'
fruit_02 = fruit_01
其内存的分配情况如下图所示:


图 3 变量赋值内存分配情况

2、类型用于标识对象所属的数据类型(类),数据类型用于限定对象的取值范围以及允许执行的处理操作。使用内置函数type(obj)可以返回对象obj所属的数据类型。

3、值用于表示对象的数据类型的值。使用内置函数print(obj)可以返回对象obj的值。

Python 是一种动态类型的语言,也就是说,变量的类型可以随时变化。在 Python 语言中,使用内置函数 type 可以返回变量类型。

【实例】使用内置函数 type、id 和 print 查看对象。
myvalue = "C语言中文网"
print(id(myvalue))
print(type(myvalue))
print(myvalue)
myvalue = 123
print(id(myvalue))
print(type(myvalue))
print(myvalue)
运行结果为:

57054952
<class 'str'>
C语言中文网
5638176
<class 'int'>
123

上述例子中,创建变量 myvalue,并赋值为字符串“C语言中文网”,然后输出该变量的类型,可以看到该变量为字符串类型,再将变量赋值为数值 123,并输出该变量的类型,可以看到该变量为整型。

Python 也是一种强类型语言,每个变量指向的对象均属于某个数据类型,即支持该类型运行的操作运算。当允许多个变量指向同一个值,使用内置函数 id 可以返回变量所指的内存地址。例如,将两个变量都赋值为数字 2048,再分别应用内置函数 id 获取变量的内存地址,将得到相同的结果。

【实例】两个变量赋同样的值,验证指向的地址。
game=number=2048
print(id(game))
print(id(number))
运行结果为:

63115696
63115696

特别提醒,不同的机器,运行时显示的 id 的值有可能不同。

变量的使用

1、删除变量

使用 del 命令可以删除一个对象(包括变量、函数等),删除之后就不能再访问这个对象了,因为它已经不存在了。当然,也可以通过再次赋值重新定义变量。

变量是否存在,取决于变量是否占据一定的内存空间。当定义变量时,操作系统将内存空间分配给变量,该变量就存在了。当使用del命令删除变量后,操作系统释放了变量的内存空间,该变量也就不存在了。

当对象绑定给变量时,计数增加 1,当变量解除绑定时,计数减少 1。待计数为 0 时,对象自动释放。Python 具有垃圾回收机制,当一个对象的内存空间不再使用(引用计数为 0)后,这个内存空间就会被自动释放。所以 Python 不会像 C 那样发生内存泄漏而导致内存不足甚至系统死机的现象。Python 的垃圾空间回收是系统自动完成的,而 del 命令相当于程序主动地进行空间释放,将其归还给操作系统。

2、变量的引用

变量本身是通用的。Python 的变量实质是引用,其逻辑如下图所示。Python 的变量都可以看成是对内存中某个对象的引用,即变量指向该内存地址存储的值。


图 4 变量引用的逻辑示意图

通过上图可以看出,变量把对象和自己连接起来(指针连接对象空间),建立了变量和对象之间的映射关系,这就是引用。

引用完成,就实现了赋值。变量是到内存空间的一个指针;对象是一块内存空间,内存空间里存储对象所表示的值;引用是自动形成的从变量到对象的映射关系(指针)。

3、变量修改赋值

Python 变量可以通过赋值来修改变量的“值”,但并不是原地址修改。

例如,变量 x 先被赋值为 1,然后又被赋值为 1.5 之后的逻辑如下图所示。


图 5 变量修改赋值的逻辑示意图

由上图中可见,并不是 x 的值由 1 变成了 1.5,而是另外开辟了一个地址空间存储对象,让 x 指向它。变量的值并不是直接存储在变量里,而是以“值”对象的形式存储在内存某地址中。可以说变量指向那个“值”对象。

因此,Python 变量里存放的实际是“值”对象的位置信息(内存地址)。这种通过地址间接访问对象数据的方式,称为引用。

使用 id 函数可以确切地知道变量引用的内存地址,使用运算符 is 可以判断两个变量是否引用同一个对象。

【实例】运算符 is 可以判断两个变量是否引用同一个对象。
a = 3
b = 3
print(a is b)
str1 = 'hello'
str2 = 'hello'
print(str1 is str2)
运行结果为:

True
True

显然,a 和 b 都赋值为相同的小整数或者短字符串时,两个变量所引用的是同一个对象。这也被称为“驻留机制”。这是 Python 为提高效率所做的优化,节省了频繁创建和销毁对象的时间,也节省了存储空间。但是,当两个变量赋值为相同的大整数或者长字符串时,默认引用的是两个不同的对象,不过可以利用变量之间的赋值来让两个变量引用相同的对象。

4、变量值的比较和引用判断

在 Python 语言中,通过“==”运算符可以判断两个变量指向的对象值是否相同;通过“is”运算符可以判断两个变量是否指向同一对象。

例如:
# 使用 == 运算符比较值
a = 3
b = 3
c = 4

print(a == b)  # 输出 True,因为 a 和 b 的值都是 3
print(a == c)  # 输出 False,因为 a 的值是 3,而 c 的值是 4

# 使用 is 运算符比较对象的引用
str1 = 'hello'
str2 = 'hello'

# 由于 Python 会缓存短字符串,str1 和 str2 指向同一个字符串对象
print(str1 is str2)  # 输出 True

# 对于不可变数据类型(如整数和短字符串),赋值相同的值时,可能会指向同一个对象
x = 1000
y = 1000
print(x is y)  # 输出 True,因为 x 和 y 都指向缓存的同一个整数对象

# 但是,如果修改其中一个对象,它们将不再指向同一个对象
z = 1001
print(z is y)  # 输出 False,因为 z 是一个新的对象
运行结果为:

True
False
True
True
False

推荐阅读