Python赋值机制与多种语法形式详解
本文深入解析Python中赋值的本质:变量名与对象的关联而非复制。详细对比C++与Python的差异,并系统介绍基础赋值、元组与列表解包、扩展序列解包、多目标赋值及增强赋值等语法形式,结合代码示例说明变量交换等实际应用。
Python中赋值的含义
在C++等语言中,变量通常直接代表对象本身,对变量进行赋值操作即修改该对象的内容。
而在Python中,赋值的本质是将变量名与具体的对象实例建立关联,即变量指向了该对象。当对变量再次执行赋值操作时,原对象并不会被修改(其引用计数会减1),而是变量转而指向了新的对象。
这一机制导致了一个重要后果:当多个变量指向同一个可变对象时,通过其中一个变量修改对象内容,其他指向同一对象的变量也会观察到相同的变化。
下面的代码清楚地显示了这一点:
>>> a = [0, 1, 2, 3]
>>> b = a
>>> a
[0, 1, 2, 3]
>>> b
[0, 1, 2, 3]
>>> a[0] = 99
>>> a
[99, 1, 2, 3]
>>> b
[99, 1, 2, 3]
>>> a = [5, 6, 7, 8]
>>> a
[5, 6, 7, 8]
>>> b
[99, 1, 2, 3]
Python赋值语句的多种形式
Python语言具有许多独特之处,入门容易但精通需要深入理解其背后复杂的实现机制。本文以Python赋值语句的多种表现形式为例进行说明。
赋值语句的特性
赋值语句创建的是对象引用,而非对象的副本;
变量在首次被赋值时自动创建,无需提前声明变量名;
变量在参与运算或引用前必须先完成赋值;
执行隐式赋值的一些操作包括:模块导入、函数和类的定义、函数参数传递以及for循环中的变量绑定。
运算 | 解释 |
spam = 'Spam' | 基础(basic)形式 |
spam, ham = 'yum', 'YUM' | 元组赋值(基于位置) |
[spam, ham] = ['yun', 'YUM'] | 列表赋值(基于位置) |
a, b, c, d = 'Spam' | 推广的(generalized)序列赋值 |
a, *b = 'Spam' | 扩展序列解包(Unpacking:解包、拆包) |
spam = ham = 'lunch' | 多目标(multiple target)赋值 |
spam += 42 | 增强(augmented)赋值 |
上表取自《Python学习手册》表 11-1
基础(basic)形式
这是最常见的赋值方式,例如:
a=123元组赋值(元组解包赋值)
a, b, c= 1, 2, "john"该形式等同于 (a, b, c) = (1, 2, "john")
整型对象1和2分别分配给变量a和b,字符串对象"john"分配给变量c。在元组赋值中,括号可以省略。
这也是一种无需创建临时变量即可交换两个变量值的方法,详见后文“Python中交换两个变量的值”中的法二。
列表赋值(列表解包赋值)
[x, y, z] = [10, 20, 30]推广的(generalized)序列赋值
可以将多个对象分配给多个变量。任何序列或其他可迭代对象都可以赋值给长度相同的名称序列。例如:
a, b, c = 'xyz'参见下图:

扩展序列解包(Extended sequence unpacking)
带有星号前缀的变量名可以收集未被匹配的元素项。例如:
a, *b, c = [1, 2, 3, 4]参见下图:

多目标(multiple target)赋值
Python允许同时为多个变量赋值。例如:
a = b = c = 2以上实例中,创建一个整型对象,值为2,三个变量被分配到相同的内存空间上。
增强(augmented)赋值
除+=外,还有-=、*=、/=、%=、**=、//=
【简要说明】
运算符 | 描述 | 功效 |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
Python中交换两个变量的值
假设
x = 10
y = 20法一: 创建临时变量,并交换
使用临时变量temp,将x的值存储在temp变量中,接着将y值赋给x,最后将temp赋值给y变量。
temp = x
x = y
y = temp法二:不使用临时变量,python特有的,利用元组赋值
x, y = y, x以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













