Python中赋值的含义及说明
作者:vanlywang 发布时间:2023-01-05 23:11:38
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
来源:https://blog.csdn.net/m0_46463996/article/details/108001481
猜你喜欢
- 做一个将本地图片上传到mysql数据库的小实例,顺便也下载下来到桌面检测是否上传成功。在写代码之前得先在数据库中建立image表,用来存储图
- 在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束。使用iter()内置函数,我们可以将诸如表、字典等
- 前言大家都知道PHP-FPM内置了状态页,开启后可查看PHP-FPM的详细运行状态,给PHP-FPM优化带来帮助。打开php-fpm.con
- 需求:主线程开启了多个线程去干活,每个线程需要完成的时间不同,但是在干完活以后都要通知给主线程下面上代码:#!/usr/bin/python
- Python异步编程之Asyncio1. 协程简介1.1 协程的含义及实现方法协程(Coroutine),也可以被称为微线程,是一种用户态内
- in Navicat for MySQL,PostgreSQL and Oracle 产生错误的原因是mysql帐户连接到远程mysql服务
- DOME<input type="file" @change="upload" ref=&qu
- 将try except中捕获到的异常信息输出到日志文件中,方便查找错误原因,tranceback模块提供了把详细出错堆栈信息格式化成字符串返
- Python常见的异常提示及含义对照表如下:异常名称描述BaseException所有异常的基类SystemExit解释器请求退出Keybo
- 项目应用中,曾有以下一个场景:接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。所以想
- 想到TDE(Transparent Data Encryption)。 TDE MSDN 说明: “透明数据加密”(TDE) 可对数据和日志
- 本文实例为大家分享了HTML5 JS压缩图片,并获取图片BASE64编码上传的方法,供大家参考,具体内容如下基本过程1) 调用 FileRe
- Pytest-sugar是一款用来改善控制台显示的插件,增加了进度条显示,使得在用例执行过程中可以看到进度条,而且进度条是根据用例是否通过标
- SQL Server具有强大的复制功能,除了将数据和数据库对象从一个数据库复制并准确分发的另一个数据库中,还要实行数据库之间的同步。SQL
- 在进行CSS网页布局的时候,我们经遇到刷新要保留表单里内容的时候,习惯的做法使用cookie,但是那样做实在是很麻烦,css中的behavi
- 想做个和IBM公司一样的网站LOGO,试了半天也没有做出来,郁闷之下,只好求高手帮助!先在这里谢谢了!方法一1、写上IBM,调节字号颜色2、
- 批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:UPDATE mytable SET myfield = 'v
- 编写ATM程序实现下述功能,数据来源于文件db.txt1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改2、转账功能:用户A向
- 前言本文主要给大家介绍的关于Python批量压缩png的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:1.需求为什
- 1. A List Apart CSS TopicsA List Apart是一个CSS优秀文章的收集网站,从1999年开始收集文章,关注最