3.4. 声明变量

现在您已经了解了字典、元组和列表(我的天哪!),让我们回到第 2 章中的示例程序 odbchelper.py

Python 像大多数其他语言一样,拥有局部变量和全局变量,但它没有显式的变量声明。变量通过赋值而存在,并在超出作用域时自动销毁。

示例 3.17. 定义 myParams 变量


if __name__ == "__main__":
    myParams = {"server":"mpilgrim", \
                "database":"master", \
                "uid":"sa", \
                "pwd":"secret" \
                }

注意缩进。 if 语句是一个代码块,需要像函数一样缩进。

还要注意,变量赋值是一个跨越多行的命令,反斜杠(“\”)用作行延续标记。

Note
当一个命令使用行延续标记(“\”)拆分成多行时,延续行可以以任何方式缩进;Python 通常严格的缩进规则不适用。如果您的 Python IDE 自动缩进了延续行,您应该接受其默认设置,除非您有充分的理由不这样做。

严格来说,括号、方括号或花括号(如定义字典)中的表达式可以使用或不使用行延续字符(“\”)拆分成多行。我喜欢包含反斜杠,即使它不是必需的,因为我认为它使代码更易于阅读,但这只是一种风格问题。

第三,您从未声明变量 myParams,只是为其分配了一个值。这就像没有 option explicit 选项的 VBScript。幸运的是,与 VBScript 不同,Python 不允许您引用从未赋值的变量;尝试这样做会引发异常。

3.4.1. 引用变量

示例 3.18. 引用未绑定变量

>>> x
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
NameError: There is no variable named 'x'
>>> x = 1
>>> x
1

总有一天你会感谢 Python 的。

3.4.2. 一次性赋值多个值

Python 中比较酷的编程快捷方式之一是使用序列一次性分配多个值。

示例 3.19. 一次性赋值多个值

>>> v = ('a', 'b', 'e')
>>> (x, y, z) = v     1
>>> x
'a'
>>> y
'b'
>>> z
'e'
1 v 是一个包含三个元素的元组,(x, y, z) 是一个包含三个变量的元组。将一个赋值给另一个,会将 v 的每个值按顺序赋值给每个变量。

这有很多用途。我经常想为一系列值分配名称。在 C 中,您将使用 enum 并手动列出每个常量及其关联的值,当这些值是连续的时,这看起来特别乏味。在 Python 中,您可以使用内置的 range 函数和多变量赋值来快速分配连续值。

示例 3.20. 分配连续值

>>> range(7)                                                                    1
[0, 1, 2, 3, 4, 5, 6]
>>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7) 2
>>> MONDAY                                                                      3
0
>>> TUESDAY
1
>>> SUNDAY
6
1 内置的 range 函数返回一个整数列表。在其最简单的形式中,它接受一个上限并返回一个从零开始的列表,该列表计数到但不包括上限。(如果您愿意,可以传递其他参数来指定除 0 以外的基数和除 1 以外的步长。您可以 print range.__doc__ 获取详细信息。)
2 MONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAYSUNDAY 是您要定义的变量。(此示例来自 calendar 模块,这是一个有趣的小模块,可以打印日历,如 UNIX 程序 calcalendar 模块为星期几定义了整数常量。)
3 现在每个变量都有其值:MONDAY0TUESDAY1,依此类推。

您还可以使用多变量赋值来构建返回多个值的函数,只需返回所有值的元组即可。调用者可以将其视为元组,也可以将值分配给单个变量。许多标准 Python 库都这样做,包括您将在第 6 章中讨论的 os 模块。

变量的进一步阅读