对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实现多线程的两种方式
May 22 Python
python计算auc指标实例
Jul 13 Python
python实现分页效果
Oct 25 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python将图片转换为字符画的方法
Jun 16 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
Python socket如何解析HTTP请求内容
Feb 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
西德产收音机
2021/03/01 无线电
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
Python中的各种装饰器详解
2015/04/11 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
Python松散正则表达式用法分析
2016/04/29 Python
利用python求相邻数的方法示例
2017/08/18 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
消防安全汇报材料
2014/02/08 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
标准版离职证明书
2014/09/12 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python