对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中执行shell命令的几个方法小结
Sep 18 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
python中栈的原理及实现方法示例
Nov 27 Python
基于python判断目录或者文件代码实例
Nov 29 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
python 实现屏幕录制示例
Dec 23 Python
python分别打包出32位和64位应用程序
Feb 18 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Django 路由系统URLconf的使用
2018/10/11 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
python画环形图的方法
2020/03/25 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
人力资源行政经理自我评价
2013/10/23 职场文书
初中生自我鉴定
2014/02/04 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python