跳到主要内容

Python 变量

Python 中的变量不需要声明,但是变量使用前必须赋值(即便是空值),变量赋值以后该变量才会被创建。变量的赋值使用等号(=),等号运算符左边是一个变量名,右边是存储在变量中的值。

实际上,在 Python 中,变量就是变量,它没有类型,我们平常说的“类型”指的是变量所指向的内存中对象的类型。

变量命名规则

变量名必须遵守下面几条基本规则:

  • 变量名的长度不受限制,但其中的字符必须是字母、数字或下划线,不能使用空格、连字符、标点符号、引号或其他字符。
  • 变量名的第一个字符不能是数字,而必须是字母或下划线。
  • Python 区分大小写,因此 TAX、Tax 和 tax 是截然不同的变量名。
  • 不能将 Python 关键字用作变量名。例如 if、else、while、def、or、and、not、in 等等。

与变量一样,函数、模块和类也都有名称。我们将这些名称统称为标识符。

下划线命名模式

单下划线和双下划线在 Python 变量和方法名称中都各有其含义。有一些含义仅仅是依照约定,被视作是对程序员的提示,而有一些含义是由 Python 解释器严格执行的。

这里先简单介绍一下:

模式举例含义
单前导下划线_var命名约定,仅供内部使用。通常不会由 Python 解释器强制执行(通配符导入除外),只作为对程序员的提示。
单末尾下划线var_按约定使用以避免与 Python 关键字的命名冲突。
双前导下划线__var当在类上下文中使用时,触发“名称修饰”。由 Python 解释器强制执行。
双前导和双末尾下划线__var__表示 Python 语言定义的特殊方法。避免在你自己的属性中使用这种命名方案。
单下划线_有时用作临时或无意义(不关心)变量的名称。也表示 Python REPL 中最近一个表达式的结果。

赋值语句

赋值语句包含3个主要部分:左值、赋值运算符和右值。

赋值语句有两个用途:

  • 定义新的变量;
  • 让已定义的变量指向特定值。

在 Python 中,可以将任何值赋给变量,包括其他变量的值,请看下面的一系列赋值语句:

x = 5
y = 'cat'
x = y
提示

常用于描述变量和值的术语很多。我们有时候说将值赋给变量或给变量指定值。

对于已经赋值的变量,说它指向、标记或拥有相应的值。

程序员有时说变量包含其值,好像变量是桶,而值在桶内。这种说法的问题在于,Python 变量并不符合你以为的 “包含” 模型。例如,在 Python 中,同一个对象不能同时出现在多个桶内,但可以有多个变量同时指向它。

多重赋值

在 Python 中,有一种便利的技巧,让你能够同时给多个变量赋值:

x, y, z = 1, 'two', 3.0

在交互模式下测试

>>> x, y, z = 1, 'two', 3.0
>>> x
1
>>> y
'two'
>>> z
3.0
>>> x, y, z
(1, 'two', 3.0)

正如最后一条语句演示的,还可以在一行显示多个值,方法是将它们作为元组,元组总是以左圆括号开始,以右圆括号结尾。

多重赋值的一个很实用的用途是交换两个变量的值,如下:

a, b = 5, 9  # (5, 9)
a, b = b, a # (9, 5)

语句 a, b = b, a 的含义是同时给变量 a 和 b 赋值。如果不适用多重赋值,将两个变量的值互换就需要使用中间变量。

多重赋值的功能并不比常规赋值多,它只是一种偶尔使用的比较便利的快捷方式。

变量如何引用值

对于 x = expr 这样的 Python 赋值语句,可以这样解读:让 x 指向表达式 expr 的值。

对于没有任何变量指向的值,Python 会自动将其删除。一般而言,Python 跟踪所有的值,并自动删除不再有变量指向的值。这称为垃圾收集,因此 Python 程序员很少需要为删除值操心。

  • 赋值时不复制

    你必须得明白,赋值语句并不会复制指向的值,而只是标记和重新标记既有值。因此,无论变量指向的对象有多大、多复杂,赋值语句的效率都非常高。

  • 数字和字符串是不可变的

    在 Python 中,数字和字符串的一个重要特征是不可变,即不能以任何方式修改它们。在看起来是修改数字或字符串的情况下,Python 实际上是在创建修改版本的拷贝。