对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中使用第三方库xlrd来读取Excel示例
Apr 05 Python
python操作ie登陆土豆网的方法
May 09 Python
详解Python字符串对象的实现
Dec 24 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
python基于SMTP协议发送邮件
May 31 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python“静态”变量、实例变量与本地变量的声明示例
Nov 13 Python
基于Python实现对比Exce的工具
Apr 07 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中截取字符串支持utf-8
2007/01/18 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
眼镜促销方案
2014/03/15 职场文书
旅游文化节策划方案
2014/06/06 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
学期个人自我总结
2015/02/13 职场文书
赢在中国观后感
2015/06/02 职场文书
vue ref如何获取子组件属性值
2022/03/31 Vue.js
mysql的Buffer Pool存储及原理
2022/04/02 MySQL