对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的Flask框架下收发电子邮件的教程
Apr 21 Python
Python中List.index()方法的使用教程
May 20 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python3获取当前目录的实现方法
Jul 29 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
Django 自动生成api接口文档教程
Nov 19 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
python实现滑雪游戏
Feb 22 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 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缓冲区为你的站点加速
2015/10/10 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
vue监听input标签的value值方法
2018/08/27 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
python常见的格式化输出小结
2016/12/15 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
Django model序列化为json的方法示例
2018/10/16 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
python mysql中in参数化说明
2020/06/05 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
阿里云:Aliyun.com
2017/02/15 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
为什么使用接口?
2014/08/13 面试题
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
GMP办公室主任岗位职责
2014/03/14 职场文书
经典禁毒标语
2014/06/16 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
新教师教学工作总结
2015/08/12 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang