对python append 与浅拷贝的实例讲解


Posted in Python onMay 04, 2018

在做Leetcode的第39题的时候,看到网上一个用递归的解法,很简洁。于是重写了一遍。

class Solution(object):
 def combinationSum(self, candidates, target):
 """
 :type candidates: List[int]
 :type target: int
 :rtype: List[List[int]]
 """
 result,temp = [],[]
 self.combinationSumRecu(sorted(candidates),result,0,temp,target)
 return result

 def combinationSumRecu(self, candidates, result, start, temp, target):
 if target == 0:
  result.append(temp) # 注意此处不能直接append(temp),否则是浅拷贝,之后temp.pop()时会将result中的数也pop出来
 while start < len(candidates) and candidates[start]<=target:
  temp.append(candidates[start])
  self.combinationSumRecu(candidates, result, start, temp,target-candidates[start])
  temp.pop()
  start += 1

if __name__ == '__main__':
 print Solution().combinationSum([2,3,6,7],7)

一开始没看懂combinationSumRecu中的result.append(list(temp))为什么temp要加list,因为temp本身就是一个list。但是把list去掉后,结果就出现错误。

没改前,结果是:

[[2, 2, 3], [7]]

改成result.append(temp)后:

[[], []]

为什么会这样呢?list在这里做了什么工作呢?

首先,为了验证temp每步都是一个list,我们是使用type()函数查看它的类型。

if target == 0: 
 print type(temp),temp,result 
 result.append(temp)

输出为:

<type 'list'> [2, 2, 3] []
<type 'list'> [7] [[7]]

可以看出,temp都是list。但是第二个result的结果不正确

可以将正确的值输出对比一下

if target == 0: 
 print type(temp),temp,result 
 result.append(list(temp))

输出为:

<type 'list'> [2, 2, 3] []
<type 'list'> [7] [[7]]

可以看出,本来第二个result应该为[[2,2,3]],结果变成了[[7]].

于是猜想可能是append()浅拷贝问题。

append(temp)后又在后面进行temp.pop()操作。result实际上append的是temp的引用。当temp所指向的地址的值发生改变时,result也会跟着改变。

举个例子验证一下:

a = [1,2] 
b = [3,4] 
a.append(b) 
print a 
b.pop() 
print a

输出结果为:

[1, 2, [3, 4]]
[1, 2, [3]]

要解决这个问题,需要对temp进行深拷贝后append到result中。而list(temp)就会返回temp的一个深拷贝。

除了用list(temp)以外,还可以用temp[:]进行深拷贝。

以上这篇对python append 与浅拷贝的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
介绍Python中的一些高级编程技巧
Apr 02 Python
浅谈Python 对象内存占用
Jul 15 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
深入理解Python分布式爬虫原理
Nov 23 Python
python实现读Excel写入.txt的方法
Apr 29 Python
python验证身份证信息实例代码
May 06 Python
python实现最小二乘法线性拟合
Jul 19 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
Python日志模块logging用法
Jun 05 Python
浅谈Python中重载isinstance继承关系的问题
May 04 #Python
对Python 2.7 pandas 中的read_excel详解
May 04 #Python
Python3读取Excel数据存入MySQL的方法
May 04 #Python
详解Django之admin组件的使用和源码剖析
May 04 #Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 #Python
使用python3+xlrd解析Excel的实例
May 04 #Python
对python中的xlsxwriter库简单分析
May 04 #Python
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
php实现上传图片文件代码
2015/07/19 PHP
php实现异步数据调用的方法
2015/12/24 PHP
php session的锁和并发
2016/01/22 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
Python多线程原理与用法详解
2018/08/20 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Django视图、传参和forms验证操作
2020/07/15 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
师范大学生求职信
2014/06/13 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
工程主管竞聘书
2015/09/15 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技