对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抓取模板之家的CSS模板
Mar 16 Python
Python中的time模块与datetime模块用法总结
Jun 30 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
Python super()函数使用及多重继承
May 06 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
python中opencv实现图片文本倾斜校正
Jun 11 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作为网站开发语言的原因分享
2012/01/03 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
初识php MVC
2014/09/10 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
js 匿名调用实现代码
2009/06/19 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
Python 查看文件的编码格式方法
2017/12/21 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Django URL参数Template反向解析
2020/11/24 Python
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
医药工作岗位求职信分享
2013/12/31 职场文书
大学生心理活动总结
2014/07/04 职场文书
行政助理岗位职责
2015/02/10 职场文书
小学思品教学反思
2016/02/20 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android