python - 具有赋值问题的递归 N 维数组创建函数
问题描述
我编写了一个函数,该函数应该使用嵌套列表递归地创建包含值的 n 维数组,表面上确实如此。(Dimensions 是一个具有数组 n 维维度的元组,即 (3,3,3) 是一个 3x3x3 数组)。但是,我的函数创建的数组存在赋值问题,因为它们无法在不将该值分配给其他嵌套列表的情况下将值分配给单个索引。奇怪的是,当我声明一个具有相同维度和值但使用一行嵌套列表的数组时,即使 python 声明对象相等,使用“手动”数组进行赋值也可以正常工作。
def createboard(dimensions,value):
if dimensions[1:]:
return dimensions[0]*[createboard(dimensions[1:],value)]
else:
return dimensions[0]*[value]
example = createboard((3,3,2),0)
print(example)
manual = [[[0, 0], [0, 0], [0, 0]],
[[0, 0], [0, 0], [0, 0]],
[[0, 0], [0, 0], [0, 0]]]
print(manual == example)
example[1][1][0] = True
print('example =', example)
manual[1][1][0] = True
print('example =', manual)
输出:
[[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
True
example = [[[True, 0], [True, 0], [True, 0]], [[True, 0], [True, 0], [True, 0]], [[True, 0], [True, 0], [True, 0]]]
example = [[[0, 0], [0, 0], [0, 0]], [[0, 0], [True, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
谢谢你的帮助。
解决方案
简短回答:替换:
return dimensions[0]*[createboard(dimensions[1:],value)]
和:
return [createboard(dimensions[1:],value) for _ in range(dimensions[0])]
请注意,前者只进行一次递归调用,而后者进行dimensions[0]
递归调用,这要昂贵得多;但后者实际上创建了dimensions[0]
不同的列表,而不是多次重用同一个列表。
详细解释: 列表列表变化意外跨子列表反映
推荐阅读
- kubernetes - HDFS 名称节点未在 Kubernetes 上正确显示数据节点列表
- amazon-web-services - 创建 eks 集群时 terraform 上的 ARN 错误无效
- python - 一种在列表(数组)中拆分特定项目的优雅方法?
- azure - 使用 Microsoft Blob 存储静态网站和自定义域的 CDN;一个人如何使用非www?
- docker - skaffold 不会在 minikube 中重新加载 golang 代码
- swift - 将颜色设置为 UIColor.clear 和 nil 之间有实际区别吗?- 斯威夫特
- flutter - UI中面临的问题[颤振]
- python - Python Matplotlib:for循环中的savefig图
- eclipse - 如何更改配置文件以获取正确的 java 位置以运行 scala ide - “返回的退出代码 1”
- python - 如何在本地 Jupyter Notebook 中进行离线作业?