Python中赋值的含义及说明
作者:vanlywang
Python中赋值的含义
在C++中,变量就是对象本身,对变量赋值就改变了它代表的对象。
而在Python中,赋值的含义却是关联变量名字和实际对象,即变量指向了实际对象,当对变量再次赋值时,变量原来指向的对象并不会改变(其实对象的reference count会减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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。