python多维列表:无法正确存储值

时间:2013-10-12 08:20:59

标签: python multidimensional-array

我遇到了一个非常奇怪的问题。我使用多维列表来存储一些数据。数据位于.txt文件中,每行有9位数,并且有450行数据。对于每9行数据(9x9数字网格),我想将它们分组为子列表。我使用下面的代码来存储数据,我的问题是当我完成并打印多维列表时,似乎列表中的每一行数据都是相同的。很抱歉我的描述不好,也许我的代码可以告诉所有内容,请告诉我代码有什么问题。我在Windows上使用python 2.7.5,谢谢。

# grid is a 3-dimension list, the first dimension is the index of 9x9 digit subgrid
# there are 50 9x9 digit subgrid in total.  
grid = [[[0]*9]*9]*50

with open('E:\\sudoku.txt', 'r') as f:
    lines = f.readlines()
    for line_number, line in enumerate(lines, 1):
        # omit this line, it is not data
        if line_number % 10 == 1:
            continue
        else:
            for col, digit in enumerate(line[:-1]):
                if line_number % 10 == 0:
                    x = line_number / 10 - 1
                    y = 8
                else:
                    x = line_number / 10
                    y = line_number % 10 - 2
                grid[x][y][col] = int(digit)

                # I print all the digits in the list and compare them with the .txt file
                # it shows every single cell in grid are set correctly !!
                print 'x=%d, y=%d, z=%d, value=%d '% (x, y, col, grid[x][y][col])

# But strange thing happens here
# I only get same line of value, like this:
# [[[0, 0, 0, 0, 0, 8, 0, 0, 6], [0, 0, 0, 0, 0, 8, 0, 0, 6] ... all the same line
# and 000008006 happens to be the last line of data in the .txt file
# what happens to the rest of data ? It's like they are all overwritten by the last line  
print grid

2 个答案:

答案 0 :(得分:4)

列表乘法不会克隆(或创建新的)对象,而只是简单地引用相同的(在您的情况下是可变的)对象。

见这里:

a = [[3]*3]*3
print(a)
a[0][1] = 1
print(a)

答案 1 :(得分:0)

grid = [[[0]*9]*9]*50不会创建50个9x9网格。当您声明[[[0]*9]*9]*50时,python会创建9 [0]的引用。

列表乘法仅创建同一对象的新引用,换句话说,您创建的每个列表都引用内存中的相同位置,用于存储[0]列表。

A similiar question