赋值运算符是Python编程的基础,我们从第二章就开始使用它了。核心要点:赋值运算的执行顺序是从右向左。
举个栗子:
a = 3 + 4
print(a) # 输出:7执行过程:
- 先计算右边 3 + 4 得到结果 7。
- 再将结果 7 存储到左边的变量 a 中。
这就是典型的从右向左执行!
Python赋值运算符功能强大,支持三种高级用法:链式赋值、参数赋值和系列解包赋值。下面一一详解:
1. 链式赋值 (Chained Assignment)
功能: 用一行代码为多个变量赋予同一个值。
i = a = b = c = 20 # 链式赋值验证:
print(a, id(a)) # 输出: 20, 相同内存地址
print(b, id(b)) # 输出: 20, 相同内存地址
print(c, id(c)) # 输出: 20, 相同内存地址内存解析:
- 只创建了一个值为 20 的整数对象(包含ID、类型int、值20)。
- 变量 i, a, b, c 都指向同一个内存地址(存储同一个对象的ID)。
- 本质是多个引用指向同一个对象。
2. 参数赋值 (Augmented Assignment / Compound Assignment)
功能: 将运算和赋值合并,简洁高效!包括:+=, -=, *=, /=, //=, %= 等。
工作原理:
a = 20
a += 30 # 等价于 a = a + 30
print(a) # 输出: 50
a -= 10 # 等价于 a = a - 10
print(a) # 输出: 40
a *= 2 # 等价于 a = a * 2
print(a) # 输出: 80 (类型仍是int)
a /= 2 # 等价于 a = a / 2 (普通除法)
print(a) # 输出: 40.0 (注意: 结果变为float类型!)
a //= 3 # 等价于 a = a // 3 (整除)
print(a) # 输出: 13.0 (即使整除, 因a是float, 结果也是float)
a %= 3 # 等价于 a = a % 3 (取余)
print(a) # 输出: 1.0关键点:
- a op= b 等价于 a = a op b。
- 操作可能改变变量类型(如 /= 可能产生 float)。
3. 系列解包赋值 (Sequence Unpacking Assignment)
功能: 用一行代码为多个变量赋予不同的值。
基本用法:
a, b, c = 20, 30, 40 # 系列解包赋值
print(a, b, c) # 输出: 20 30 40执行顺序:
- 将 40 赋给 c。
- 将 30 赋给 b。
- 将 20 赋给 a。
内存解析:
- 右侧创建了 三个独立的对象 (20, 30, 40)。
- 左侧变量 a, b, c 按顺序 分别指向这三个对象。
铁律:
- 等号 左边的变量个数 必须与 右边的值的个数 严格相等!否则报错!
# 错误示例!变量少,值多!
a, b = 20, 30, 40 # 报错: ValueError: too many values to unpack (expected 2)解包赋值的妙用:交换变量值
传统方法 (需中间变量):
temp = a
a = b
b = tempPython 优雅解法 (一行搞定!):
a, b = 10, 20
print("交换前:", a, b) # 输出: 10 20
a, b = b, a # 核心!利用解包赋值交换值
print("交换后:", a, b) # 输出: 20 10原理:
- 右侧 b, a 会先计算,生成一个临时的元组 (20, 10)。
- 然后解包赋值给左侧 a, b,即 a = 20, b = 10。
Python 的简洁强大,在此体现得淋漓尽致!
总结:
掌握 =(基础)、a=b=c(链式)、a += b(参数)、a, b = c, d(解包)这四种赋值形式,是写出高效、优雅 Python 代码的关键一步!尤其是解包赋值带来的变量交换功能,堪称 Python 语法糖的经典之作!
