python - 追加到多维列表索引追加到所有索引
问题描述
我编写了一个类来生成和操作代表 9 x 9 网格的多维列表。我有一个产生这个列表的方法。该列表似乎生成得很好,但是当我尝试附加到特定索引时,它会附加到所有列表中。
class Grid:
def __init__(self):
self.size = range(9)
self.grid = self.make_new_grid([])
def make_new_grid(self, contents):
grid = []
for row in self.size:
grid.append([])
for column in self.size:
grid[row].append(contents)
return grid
grid = Grid()
grid.grid[4][5].append(8)
print('class grid', grid.grid)
输出:
class grid [[[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]], [[8], [8], [8], [8], [8], [8], [8], [8], [8]]]
为了测试这一点,我对同一个网格进行了硬编码并做了同样的事情。我得到的输出符合预期。
compare_grid = [[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []]]
compare_grid[4][5].append(8)
print(compare_grid)
输出:
comparison grid [[[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [8], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []]]
最后我测试了类生成的网格和我的硬编码网格是否相等:
grid = Grid()
compare_grid = [[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []],
[[], [], [], [], [], [], [], [], []]]
print(grid.grid==compare_grid)
输出:
True
我试图解决这个问题一段时间,但我似乎无法找到答案。
解决方案
您继续附加与内部列表相同的对象:
grid[row].append(contents)
因此,当然,当您追加到该列表时,它是外部列表中唯一不同的对象,更改随处可见。
您可以附加一个副本来解决此问题:
grid[row].append(contents.copy())
推荐阅读
- json - JSON.parse Unexpected Token xmlhttprequest 和 node.js
- angular - 在现有对象中添加新的可选属性不会将此新属性绑定到组件的 @input 属性
- php - cpanel上传后不支持index.php
- java - 我的应用程序按钮不起作用,handler.java 错误
- java - Lombok 的@Builder/@AllArgsConstructor 如何调用自定义构造函数?
- mysql - phpMyAdmin 不访问会话变量
- java - SpringBoot 应用程序测试中的 @Import 与 @ContextConfiguration
- php - Symfony 中的复合主键
- ios - 在 UIPanGestureRecognizer 更改状态中更改 UIView 的 alpha
- java - Java 10 是否消除了每个循环?