一个看似初级的Python小问题,高手也难保不掉进坑里

python----组合数据类型以及字符串,元组,列表部分内容 一.组合数据类型 组合数据类型分为3种:集合类型,映射类型,序列类型。 集合类型:元素之间无序且相同元素唯一存在。用 { } 表示,没有索引和位置的概念,集合元素可以动态的增删 序列类型:元素之间有序且相同元素可以同时存在,元素之间不排他。序列类型的代表:字符串类型,元组类型,列表类型 映射类型:****‘键-值’,每个元素是一个键值对,表示为(key,value)。 映射类型代表有字典类型 ... 阅读详情

昨晚有同学问了一个非常有意思的问题。问题本身很简单,却包含了初学者不易理解、编码实践中又处处可见的几个知识点。如果对这些知识点理解有偏差,即便是经验丰富的Python程序员,稍不留神也会掉进坑里。

def f(w, a, b): 
    w.append(a) 
    w = w + [b] 
    return w 
 
w, a, b = [5, 9], 2, 1 
w = f(w, a, b) + w 
print(w) 

如果将上面代码稍作改动,函数中的赋值操作(=)变成加等操作(+=),正确的输出结果又是哪一个呢?

def f(w, a, b): 
    w.append(a) 
    w += [b] 
    return w 
 
w, a, b = [5, 9], 2, 1 
w = f(w, a, b) + w 
print(w) 

要想正确回答问题,首先要了解可变对象和不可变对象的概念,以及可变对象和不可变对象作为函数参数是如何向函数传参的。

那么,什么是可变对象、什么是不可变对象呢?在Python中,整型(int)、浮点型(float)、布尔型(bool)、元组(tuple)和字符串(str)等内置类,一旦实例化就不可改变,属于不可变对象;而列表(list)、字典(dict)和集合(set)等内置类,实例化后得到对象,可以任意修改。

读到这里,有些初学者可能会不理解:元组、字符串不可改变,老师和教科书上都是这么说的,整型浮点型对象为什么不可变呢?让x=1之后,x就不能改变了吗?加1不就变成2了吗?显然,这是对对象概念的误解。x=1,是让x指向了值为1的整型对象,但x并不是真正的整型对象,只是一个名字而已,我们称其为变量名或对象名 。x加1变成2,并非值为1的整型对象自身加1,而是让x指向了另一个值为2的整型对象。

>>> id(x) 
2794729897296 
>>> x += 1 
>>> id(x) 
2794730437616 
>>> y = [1,2] 
>>> id(y) 
2794699482248 
>>> y += [3] 
>>> id(y) 
2794699482248 
>>> y = y + [4] 
>>> id(y) 
2794699482376 

借助Python的id函数(返回变量名所指对象的内存首地址),可以清楚看到,执行加等操作(+=)之后,x指向的整型对象地址发生了改变,y指向的列表对象地址并未改变。不过,对y执行赋值操作(=)之后,y指向的列表对象地址发生了改变。这表明,赋值操作(=)是在变量名和对象之间新建对应关系,而加等操作(+=)并不改变变量名和对象之间的对应关系,除非对象是不可变的。

理解了可变对象和不可变对象的概念之后,就很容易理解可变对象和不可变对象作为函数参数是如何向函数传参的了。如下图所示,红色箭头指向的是可变对象作为参数传递到函数,绿色箭头指向的是不可变对象作为参数传递到函数。对于不可变对象而言,无论函数内部如何改变这些参数,都不会影响到函数外部的不可变对象,因为他们是不可改变的。对于可变对象来说,函数内部对于它们的任何操作都是施加于对象本身的,这个对象即函数外部的变量所指向的对象。需要说明的是,函数的参数传递,并不要求实际参数和形式参数同名,下图红绿箭头对应的实际参数和形式参数名字相同,仅是我个人的习惯,并非规则要求。

是时候进入正题了。第一段代码中,可变对象w和不可变对象a、b作为参数传进函数后,内部变量名w和外部变量名w指向同一个对象,append操作自然也会影响外部变量名w所指向的列表对象。其后的赋值操作将函数内部的变量名w指向了另外一个新的列表对象,因而不会改变外部的变量名w所指向的列表对象。如下图所示,不言自明,代码最后的输出结果应该是D,即[5, 9, 2, 1, 5, 9, 2]。

在第二段代码中,由于+=操作不改变内部变量w的指向,外边变量w所指向的列表自然也变成了[5, 9, 2, 1],最终的输出结果是两个[5, 9, 2, 1]相加,正确答案是E, 如下图所示。

标准高斯过程回归(Gaussian Processes Regression, GPR)从零开始,公式推导 标准高斯过程回归从零开始公式推导 阅读详情

相关推荐

WIN下使用visual studio 2022安装GMSSL命令行工具

2.1 使用管理员权限打开visual studio(非常重要,否则最后一步 nmake install会失败)右键vs2022,以管理员身份运行即可。2.4 配置环境变量,gmssl可执行程序默认会被安装到如下目录。将如下路径添加到系统环境变量即可。添加后的环境变量如下。2.编译解压后的gmssl源码,编译过程主要参考install.md中的内容,README.md中的步骤不完整。2.2 打开vs2022的命令终端,右键文件,选择在终端中打开。1.下载gmssl源码,解压到相应目录。

qq_45794382的博客 1269

Python变量

1.字符串和元组属于不可变序列,这意味着不能通过下标的方式来修改其中的元素值。 x=(1,2,3)是元组 元组不能通过下标来修改其中的元素值 2、变量在【-5,256】之间的数,相同的数存储地址一样,区间外相同的数的存储位置不一样。 同一个程序中同 ...

慕云 662

别再对着ACF/PACF图发懵了!用R语言实战教你一眼分清AR、MA和ARMA模型

本文通过R语言实战详细解析了时间序列分析中AR、MA和ARMA模型的特征图识别技巧。重点讲解了如何通过ACF和PACF图的截尾与拖尾特征快速判断模型类型,帮助数据分析师建立从图形到模型的直觉映射,提升时间序列分析的效率和准确性。

weixin_28706923的博客 356

python中的数据类型

值改变,id不变,证明改的是原值,证明原值是可以被改变的==不可变类型:==值改变,id也变了,证明是产生新的值,压根没有改变原值,证明原值是不可以被修改的列表、字典是可变的数据类型。

qq_73797346的博客 847

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5570

Cesium 实现动态加载气象数据:渲染成动态雨雪/云层效果(源码 + 原理)

本文介绍了在Cesium中实现动态天气效果的技术方案。核心思路是通过时间轴驱动多层数据动态切换,包括:1)时间维度处理,按序列加载不同气象图层;2)空间维度处理,将气象数据切分为瓦片;3)效果层实现,制作风场、降水等动态可视化效果。文章详细讲解了后端数据预处理(生成瓦片和风场JSON)、前端实现(双层雷达瓦片交替渐变、风场粒子系统)的具体方法,并提供了完整的代码示例。此外还探讨了雨雪粒子、云层效果等增强功能,以及工程化建议,为构建科学准确的动态天气可视化系统提供了实用解决方案。

专注AI大模型,软件混淆,授权 623

pyhton格式化运算

1、垃圾回收机制 x = 10 #直接引用 y=x z=x print(id(x)) print(id(y)) print(id(z)) l=[‘a’,‘b’,x] #间接引用 d={‘mmm’:x} # 间接引用 2、标记清除 x=10 l=[‘a’,‘b’,x] # l=['a’的内存地址,'b’的内存地址,10的内存地址 x=123 print(l[2]) 循环引用:会引发内存泄露 l1=[111,] l2=[222,] l1.append(l2) l2.append(l1) print(l1) pr

m0_54379053的博客 231

微信小程序启用蓝牙设备特征值变化时的notify功能

注意:这里的serviceUUID、notifyCharacteristicUUID 我会在后面写入数据时做重点说明。isNotifyBLECharacteristic:false, //是否启用蓝牙设备服务特征 notify。二、启用蓝牙设备特征值变化时的notify功能。下一篇 将继续介绍 微信小程序蓝牙设备写入数据。

wsk198726的专栏 1172

Python id(x)函数

可以用id(x)函数来查看具体的变量在内存中的地址是否一致。 可以发现都来源于同一内存地址,即引用自同一对象 PS:在python 3.x版本里,相同英文字符串会显示在同一个地址里,但是中文字符串不会显示在同一个地址里 >>> t1='dog' >>> t2='dog' >>> if t1 is t2: print('两只英文狗在同一个地址...

Song的博客 6287

Go语言Gin框架项目:从零到一搭建一个用户管理系统

本文介绍了一个基于Go语言Gin框架开发的用户管理系统。系统采用MySQL数据库存储数据,使用Bootstrap 5构建现代化UI界面,实现了完整的CRUD功能。主要特点包括:RESTful API设计、前后端双重表单验证、实时搜索功能、SQL防注入措施以及响应式布局。项目结构清晰,包含数据库配置、用户模型、处理器和前端模板等模块。系统提供用户列表展示、新增/编辑表单、删除确认等功能,通过参数化查询确保安全性,并支持按姓名或邮箱搜索用户。

数据知道的博客 3995

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

perseverance51博客 5786

python入门必备10个坑_Python入门容易掉进的10个坑

相比于其他语言,Python的语法比较简单易学,但一旦不注意细节,刚入门的新手很容易就会掉进语法错误的坑里。1.忘记写冒号在 if、elif、else、for、while、class、def 语句后面忘记添加“:”if spam ==42print('Hello!')2. 误用 “=” 做等值比较“=”是给变量赋值,“==”才是判断两个值是否相等:score = 60if score = 60:p...

weixin_39611340的博客 134

Simulink智能驾驶场景探索:自动泊车系统设计与验证

自动泊车系统(APS)传感器模块:用于检测车辆周围的障碍物和其他车辆的位置。路径规划模块:根据传感器数据生成最优的泊车路径。控制器模块:根据路径规划结果生成转向角、速度等控制信号。执行器模块:根据控制器生成的信号调整车辆的方向盘、油门和刹车。在本实例中,我们将使用超声波传感器和摄像头来检测车辆周围的环境,并使用PID控制器实现自动泊车功能。通过本教程,我们介绍了如何使用 Simulink 进行自动泊车系统的仿真。背景介绍:理解自动泊车系统及其在智能驾驶中的应用。所需工具和环境。

MHD0815的博客 506

python入门必备10个坑_新手注意!Python最容易掉进去的10个坑

​​​图片图片相比于其他语言,Python的语法比较简单易学,但一旦不注意细节,刚入门的新手很容易就会掉进语法错误的坑里。1. 忘记写冒号在 if、elif、else、for、while、class、def 语句后面忘记添加“:”if spam == 42print('Hello!')2. 误用 “=” 做等值比较“=”是给变量赋值,“==”才是判断两个值是否相等:score = 60if sco...

weixin_35949435的博客 260

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python入门容易掉进的10个坑

相比于其他语言,Python的语法比较简单易学,但一旦不注意细节,刚入门的新手很容易就会掉进语法错误的坑里。 忘记写冒号 在 if、elif、else、for、while、class、def 语句后面忘记添加“:” if spam == 42 print(‘Hello!’) 误用 “=” 做等值比较 “=”是给变量赋值,“==”才是判断两个值是否相等: score = 60 if scor...

weixin_45457336的博客 188

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python最容易掉进去的10个坑

关注头条号,私信回复资料会有意外惊喜呦………………最后一张照片有资料呦。相比于其他语言,Python的语法比较简单易学,但一旦不注意细节,刚入门的新手很容易就会掉进语法错误的坑里。1. 忘记写冒号在 if、elif、else、for、while、class、def 语句后面忘记添加“:”if spam == 42 print('Hello!')2. 误用 “=” 做等值比较“=”是给变量赋值,“=...

weixin_33772645的博客 230

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python写网站容易崩吗_Python入门容易掉进的10个坑

相比于其他语言,Python的语法比较简单易学,但一旦不注意细节,刚入门的新手很容易就会掉进语法错误的坑里。1. 忘记写冒号在 if、elif、else、for、while、class、def 语句后面忘记添加“:”if spam == 42print('Hello!')2. 误用 “=” 做等值比较“=”是给变量赋值,“==”才是判断两个值是否相等:score = 60if score = 60...

weixin_39878989的博客 191

“编程能力差,不敢学AI?”赵辛博士:80%的人都掉进了这个坑里

AI博士赵辛老师曾说过——超80%的程序员在初学Python 人工智能时,都会遇到下面3个问题:1. 应用方向太多了!不知从何学起,也不知道学完做什么2. Python语法、机器学习/深度...

Python大本营的博客 1341
上一篇: 有人总结了70多个Python精选项目:再也不用去GitHub、Reddit大海捞针了
下一篇: 用Python进行人脸识别[包括源代码]
python588
博客等级 码龄7年 338粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值