我写了一个类来生成和处理代表9 x 9网格的多维列表。我有一种方法可以生成此列表。列表似乎制作得很好,但是当我尝试附加到特定索引时,它将附加到所有列表。
bfill
输出:
dfr.a=dfr.bfill(1).a
dfr
a b c d
0 4.0 4.0 4.0 3
1 5.0 NaN 5.0 1
2 3.0 NaN 6.0 3
3 7.0 7.0 7.0 9
4 12.0 NaN NaN 12
为了测试这一点,我对相同的网格进行了硬编码并执行了相同的操作。我得到的输出符合预期。
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], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], []]]
我试图解决这个问题已有一段时间了,但是我似乎找不到答案。
答案 0 :(得分:0)
您不断添加与内部列表相同的对象 :
grid[row].append(contents)
因此,当然,当您将那个列表添加到外部列表内的唯一的不同对象时,随处可见更改。
您可以附加副本以解决此问题:
grid[row].append(contents.copy())
答案 1 :(得分:0)
正在发生的事情或多或少是这个(应该是自我解释的):
l1 = []
l2 = l1
l2.append(1) # <-- note l2
print(l1) # <-- note l1
#=> [1, 2, 3, 4]
要解决该问题,需要复制对象的“内容”而不是对象本身,例如:
l2 = l1[:]
但是在这里您可以找到更多信息:How to clone or copy a list?
根据您的情况,您可以将方法更改为:
def make_new_grid(self, contents = []):
return [[ contents[:] for col in self.size ] for row in self.size]