> For the complete documentation index, see [llms.txt](https://johannesliu.gitbook.io/data-science-python-implemented/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://johannesliu.gitbook.io/data-science-python-implemented/4.0-practice/4.2-assignment.md).

# 4.2 赋值

Python的赋值语句拥有极大的魅力，在上节中，通过对程序控制结构相关例题的学习，我们已经大致了解了如何对变量进行赋值。然而，Python赋值方式并不仅仅局限于此，另有多种不同的赋值语句。从实际需要解决的问题出发，具体问题具体分析，选择合适的赋值语句，将会使Python编程更加流畅，起到事半功倍的效果。

基础赋值语句如表2.2.x

| 赋值语句                          | 类型      | 解释                                                |
| ----------------------------- | ------- | ------------------------------------------------- |
| i=100                         | 元素赋值    | 为元素i赋值数值100                                       |
| i+=1                          | 增量赋值    | 数值i自增1，相当于i=i+1                                   |
| hust, zzu=100, ‘zzuer’        | 元组赋值    | 分别为hust和zzu赋值数值100和字符串’zzuer’                     |
| \[hust, zzu]=\[‘huster’, 100] | 列表赋值    | 分别为hust和zzu赋值字符串’huster’和数值100                    |
| a, b, c, d, e, f=’huster’     | 推广的序列赋值 | 分别为a, b, c, e, f, g赋值’h’, ‘u’, ‘s’, ‘t’, ‘e’, ‘r’ |
| a, \*b=’zzuer’                | 扩展序列解包  | 分别为a赋值z，b赋值zuer                                   |
| a=b=c = ‘zzu’                 | 多元赋值    | 为a，b，c赋同样值’zzu’                                   |

### 4.2.1 序列赋值

序列赋值，即将序列赋值给序列。在序列赋值过程中，Python会按照元素先后位置，对序列进行一次赋值。

### 4.2.2 交换赋值

我们对2.15节排序算法的学习中，初步掌握了如何交换两个变量的值。不同于其他语言，在交换两变量值时需要人工创建临时变量，用来存储中间值。如：交换变量a与b的值，可以使用第三个变量c来对a的值进行存储，然后将b值赋予a，c值赋予b。而在python语句中，仅仅使赋值号两边变量的位置不同，就可以完成变量值的交换。在元组赋值过程中，解释器会自动为右侧变量创建一个临时变量。

\>>>a=1, b=2

\>>>a, b= b, a

\>>>a, b

(2, 1)

在赋值过程中，在赋值号左右侧序列长度相等的情况下，右侧可接受任何类型的序列。

\>>>a, b, c, d, e, f=’huster’ #将字符串赋值给元组

a, b, c, d, e,f

(‘h’, ‘u’, ‘s’, ‘t’, ‘e’, ‘r’)

\>>> \[hust, zzu]=100, ‘zzuer’#将元组赋值给列表

\>>>\[hust, zzu]

\[100, ‘zzuer’]

\>>>a, b, c={1, ‘g’, 3} #将集合赋值给列表

\>>>a, b, c

(1, 3, ‘g’)

虽然我们可以在赋值号左右混用不同类型的序列，但是当赋值号左右侧序列的长度不同时，解释器会报错。

\>>>z, z, u= ‘zzuer’

Traceback (most recent call last):

File "\<pyshell#31>", line 1, in \<module>

z, z, u='zzuer'

ValueError: too many values to unpack (expected 3)

这时候，我们可以使用**分片**（详见，第四章基本数据类型）功能，来对左侧变量的接受的序列长度进行划分。

### 4.2.3 增量赋值

**增量赋值**语句是传统运算赋值语句的一种缩写。对于将变量i增加1，传统写法为i=i+1，增量赋值写法为i+=1。这两种不同写法在结果上是等价的。除了加法，增量赋值语句同时支持多种运算，如常规的加减乘除四则运算，逻辑运算，位运算，幂运算等。增量赋值语句由一个二元运算符和赋值号组成。

表2.2.x总结了常见的增量赋值语句。下列语句的执行结果全部赋给变量a。

| 增量赋值语句                  | 含义                    |
| ----------------------- | --------------------- |
| a+=b（ a-=b， a\*=b，a/=b） | 对a, b执行加法（减法，乘法，除法）运算 |
| a%=b                    | 对a执行模b取余运算            |
| a^=b                    | 对a，b执行异或(xor)运算       |
| a<<=b（a>>=b）            | 对a, b执行左移（右移）位运算      |
| a\*\*=b                 | a的b次方                 |
| a//=b                   | a除以b的结果向下取整           |
| a&=b（a\|=b）             | 对a, b执行与（或）运算         |

### 4.2.4 多元赋值

多元赋值语句可以将赋值号右边对象一次赋值给左侧变量。

\>>>a=b=c = ‘zzu’

\>>>a, b, c

('zzu', 'zzu', 'zzu')

### 4.2.5 扩列解包

扩列解包语句使用带有星号的赋值目标变量如\*x，来对右侧待赋值序列进行位置匹配。扩列解包语句的思想类似于通配符\*。在实际操作中，\*x能匹配到的序列的长度，取决于\*x左右两边变量的个数。

设赋值号右侧序列的长度为, 对于赋值号左侧的待赋值变量\*x， 假设\*x左侧有个变量，右侧有个变量，那么\*x的结果是一个由序列第位到第位个元素依次排列所组成的列表。

例

\>>>a, b, \*c, d =’huster’

\>>>c

\[‘s’, ‘t’, ‘e’]

在上例中，将’s’, ‘t’, ‘e’赋值给了列表c。

例

\>>>lis=\[1, 2, 3, 4]

\>>>a, b, c, d, \*e=lis

\>>>a, b, c, d, e

(1, 2, 3, 4, \[])

在上例中，因为\*e左侧变量个数恰等于序列长度，因此e被赋值位空列表(\[])。

例

\>>>lis=\[1, 2, 3, 4, 5]

\>>>a, b, c, d, \*e=lis

\>>>a, b, c, d, e

(1, 2, 3, 4, \[5])

在上例中，\*e匹配到的序列的末尾元素，因此e被赋值为仅有一个元素的列表(\[5])。

### 4.2.6 变量命名

#### 命名规则

在python中，当给一个变量赋值时，这个变量就会存在（？）。变量的命名需要遵循如下规则：（汉字也ok,也可以做首字符）

* 变量名由任意数量的字母、数字和下划线组成，变量名首字符必须是下划线或字母。
* python程序严格区分大小写，包括创建的名称和保留字。
* 禁止使用保留字。

表2.x列举了一些常见的保留字

| 保留字     | 说明                             |
| ------- | ------------------------------ |
| class   | 定义类                            |
| if      | 条件语句。                          |
| exec    | 用于执行python语句                   |
| for     | 循环语句                           |
| finally | 异常语句，出现异常后，是重要执行finally包含的代码块。 |
| import  | 导包                             |
| return  | 返回计算结果                         |

#### 命名惯例

在进行命名时，除了要遵循前面所介绍的命名规则外，还需要遵循不同类型的变量的命名惯例，虽然打破这种惯例，不影响程序的运行，但是在实际应用中一般都会遵循，这样做的好处是可以增强代码的可读性。

* 类名称以大写字母开头
* 模块名称以小写字母开头
* 以单一下划线开头的名称（\_X）不会被from module import \*语句导入。
* 前后均有双下划线的名称（\_\_X\_\_）是系统定义的名称，对解释器有特殊意义。
* 以双下划线开头，但结尾没有双下划线的名称(\_\_X)是外文类的本地（又称“重整“，mangle）变量。
* 通过交互式命令行运行时，只有单个下划线的名称（\_）会保存最后一个表达式的结果。
