3.4. 变量声明
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 3.4. 变量声明

现在您已经了解了有关 dictionary、tuple、和 list 的相关知识 (哦，我的老天！)，让我们回到 第 2 章 的例子程序 `odbchelper.py`。

Python 与大多数其它语言一样有局部变量和全局变量之分，但是它没有明显的变量声明。变量通过首次赋值产生，当超出作用范围时自动消亡。

### 例 3.17. 定义 `myParams` 变量

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

首先注意缩进。`if` 语句是代码块，需要像函数一样缩进。

其次，变量的赋值是一条被分成了多行的命令，用反斜线 (“`\`”) 作为续行符。

当一条命令用续行符 (“`\`”) 分割成多行时，后续的行可以以任何方式缩进，此时 Python 通常的严格的缩进规则无需遵守。如果您的 Python IDE 自由对后续行进行了缩进，您应该把它当成是缺省处理，除非您有特别的原因不这么做。

严格地讲，在小括号，方括号或大括号中的表达式 (如定义一个 dictionary) 可以用或者不用续行符 (“`\`”) 分割成多行。甚至在不是必需的时候，我也喜欢使用续行符，因为我认为这样会让代码读起来更容易，但那只是风格问题。

第三，您从未声明过变量 `myParams`，您只是给它赋了一个值。这点就像是 VBScript 没有设置 `option explicit` 选项一样。幸运的是，与 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
    >>> x
    'a'
    >>> y
    'b'
    >>> z
    'e'

| `v` 是一个三元素的 tuple，并且 `(x, y, z)` 是一个三变量的 tuple。将一个 tuple 赋值给另一个 tuple，会按顺序将 `v` 的每个值赋值给每个变量。

这种用法有许多种用途。我经常想要将一定范围的值赋给多个变量。在 C 语言中，可以使用 `enum` 类型，手工列出每个常量和其所对应的值，当值是连续的时候这一过程让人感到特别繁琐。而在 Python 中，您可以使用内置的 `range` 函数和多变量赋值的方法来快速进行赋值。

### 例 3.20. 连续值赋值

    >>> range(7)
    [0, 1, 2, 3, 4, 5, 6]
    >>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
    >>> MONDAY
    0
    >>> TUESDAY
    1
    >>> SUNDAY
    6

| 内置的 `range` 函数返回一个元素为整数的 list。这个函数的简化调用形式是接收一个上限值，然后返回一个初始值从 0 开始的 list，它依次递增，直到但不包含上限值。(如果您愿意，您可以传入其它的参数来指定一个非 `0` 的初始值和非 `1` 的步长。也可以使用 `print range.__doc__` 来了解更多的细节。)
| `MONDAY`、`TUESDAY`、`WEDNESDAY`、`THURSDAY`、`FRIDAY`、`SATURDAY` 和 `SUNDAY` 是我们定义的变量。(这个例子来自 `calendar` 模块。它是一个很有趣的打印日历的小模块，像 UNIX 的 `cal` 命令。这个 `calendar` 模块定义了一星期中每天的整数常量表示。)
| 现在每个变量都拥有了自己的值：`MONDAY` 的值为 `0`，`TUESDAY` 的值为 `1`，等等。

您也可以使用多变量赋值来创建返回多个值的函数，只要返回一个包含所有值的 tuple 即可。调用者可以将其视为一个 tuple，或将值赋给独立的变量。许多标准的 Python 库都是这样做的，包括 `os` 模块，我们将在 第 6 章 中讨论。

### 进一步阅读

- Python Reference Manual 展示了什么时候可以忽略续行符和什么时候您需要使用续行符的例子。
- How to Think Like a Computer Scientist 演示了如何使用多变量赋值来交换两个变量的值。