python - “+”与在python中的列表中追加
问题描述
我正在尝试在 python 中实现 bestSum 算法,我在第 13,14 行有以下脚本与问题。
memo = {}
def bestSum(s, l):
if s == 0:
return []
elif s < 0:
return None
elif s in memo:
return memo[s]
minList = None
for i in l:
temp = bestSum(s-i, l)
if temp != None:
temp = temp + [i] #This works LINE13
# temp.append(i) This does not work LINE14
if minList == None or len(temp) < len(minList):
minList = temp
memo[s] = minList
return minList
我知道“+”运算符返回一个新列表,而 append 函数会改变原始列表。
我的问题是为什么它在我的代码中很重要,因为临时列表仅在接下来的几行中使用。为什么他们给出不同的输出。
解决方案
append(i)
问题不在于and之间的区别,而+ [i]
在于对象在 python 中的工作方式。你差一点就搞定了。
首先,minilist = temp
使得minilist
引用相同的列表对象temp
引用,所以附加到 temp 也附加到 minilist。同时对新对象temp = temp + [i]
进行temp
新引用,而 minilist 保留对原始列表的引用。
您可以看到这就是原因,例如,在 LINE13 版本中将其转换为+= [i]
,这使得temp
它保持引用,因此它会改变两个列表。在 LINE14 版本中,您可以temp = temp.copy()
在追加之前添加以使其成为新对象。
推荐阅读
- c# - 用sendGrid附加pdf在c#中不起作用
- react-native - 如何在重新渲染页面之前获取导航参数
- javascript - 如何在反应组件上将上传的 csv 文件内容呈现为 json 输出
- android - 为什么在 RecyclerView 上 swipeRight 时测试不会失败?
- python - 如何为列表中的变量提供自己的变量以随机选择
- laravel - Laravel 5.8 调用未定义的方法 Illuminate\Events\Dispatcher::fire()
- sql - 基于 Web 的文件资源管理器的回收站
- docker - 如何在我的 docker 容器(在 TX2 板上)中使用“nvcamerasrc”运行 GStreamer 管道,而不会出现“错误:连接到 camera_daemon 失败”?
- css - 如何使内容 div 的高度为屏幕的 100%
- sql - 在 Oracle12c 中聚合 JSON 对象时如何从结果集中过滤掉记录?