对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 排列组合之itertools
Mar 20 Python
在Python中调用ggplot的三种方法
Apr 08 Python
详解Python Socket网络编程
Jan 05 Python
python爬虫的工作原理
Mar 05 Python
详解python的webrtc库实现语音端点检测
May 31 Python
python获取多线程及子线程的返回值
Nov 15 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 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
PHP中对数据库操作的封装
2006/10/09 PHP
php简单静态页生成过程
2008/03/27 PHP
php Smarty模板生成html文档的方法
2010/04/12 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
Python易忽视知识点小结
2015/05/25 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Django框架模板用法入门教程
2019/11/04 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python二维图制作的实例代码
2020/12/03 Python
python 调用Google翻译接口的方法
2020/12/09 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
怎样自定义一个异常类
2016/09/27 面试题
对公司合理化的建议书
2014/03/12 职场文书
小学作文评语大全
2014/04/21 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年体育部工作总结
2014/11/13 职场文书
校长师德表现自我评价
2015/03/04 职场文书