python - 递归附加到列表的问题
问题描述
我的代码:
matrix = []
dynamicmatrix = []
answers = []
...some other code...
def search(chartofind, row):
global dynamicmatrix
print("SEARCHING", chartofind, row)
if row == numberofrows:
toadd = dynamicmatrix.copy()
answers.append(toadd)
return
for col in range(0, numberofrows):
if canPlace(chartofind, row, col) == False and matrix[row][col] != chartofind:
continue
if matrix[row][col] == chartofind:
search(chartofind, row+1)
else:
dynamicmatrix[row][col] = chartofind
search(chartofind, row+1)
dynamicmatrix[row][col] = matrix[row][col]
search("A", 0)
for i in answers:
print(i)
问题是当我在递归中打印toadd时,它很好。但是,在遍历列表后,它被附加到;答案,它显示的值与我将其附加到列表时显示的值不同。递归中的值是正确的,但是在递归之后,整个列表的答案都被破坏了。这可能是什么原因造成的?这让我发疯,任何帮助将不胜感激。
解决方案
原因是它.copy()
需要 的浅拷贝dynamicmatrix
,这意味着矩阵中的嵌套列表也在副本中被引用,并且您对这些嵌套列表所做的任何后续更改也会影响副本。
例如,以下分配将影响您已经附加到的内容answer
:
dynamicmatrix[row][col] = chartofind
解决方案:
使用deepcopy
:
import copy
toadd = copy.deepcopy(dynamicmatrix)
或者使用列表推导显式地制作更深的副本:
toadd = [row[:] for row in dynamicmatrix]
推荐阅读
- javascript - 使用javascript或jquery提交表单数据时,如何在另一个页面上创建div元素?
- json - 如何在没有本地外部系统的情况下测试 WebHooks?
- linux - Gtk-警告**:13:51:34.650:无法打开显示
- objective-c - Objective-C 插件和 CoreML 模型在电子邮件或 Box 传输后失败
- python - 当相邻列包含某个值时,如何从每个 ID 的数据框中解析数据?
- python - 烧瓶 app.before_request 忽略不存在的路由
- microservices - 用于 Spring 微服务集成的 Eureka 服务器和 Feign Client 在生产环境中是否可以在没有互联网的情况下工作?
- laravel - 如何在 laravel 中用 eloquent 做这个查询?
- salesforce - Salesforce - 在按钮单击时调用外部 API 并从响应中更新自定义字段
- html - 我可以将这样的动画添加到纯 CSS 中按钮的边框吗?