对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中函数的参数传递
Jun 21 Python
django+js+ajax实现刷新页面的方法
May 22 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
python matplotlib画图实例代码分享
Dec 27 Python
python实现数据库跨服务器迁移
Apr 12 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
python实现车牌识别的示例代码
Aug 05 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
python代码区分大小写吗
Jun 17 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 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日历制作代码分享
2014/01/20 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
深入理解Promise.all
2018/08/08 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
详解python的几种标准输出重定向方式
2016/08/15 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
英国医生在线预约:Top Doctors
2019/10/30 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
Android面试题及答案
2015/09/04 面试题
小学教师自我鉴定范文
2014/03/20 职场文书
优质服务演讲稿
2014/05/14 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
紫日观后感
2015/06/05 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android