Python中赋值的含义及说明

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
作者:vanlywang原文地址:https://blog.csdn.net/m0_46463996/article/details/108001481

%s 个评论

要回复文章请先登录注册