列表值分配列表错误

时间:2019-04-19 06:55:16

标签: python

当我尝试将存储在列表列表中的值复制到另一个列表列表时,Anaconda中的Spyder错误地将该值分配给了第一维的所有列表。

请参见下面的代码。

我尝试在执行分配之前打印值A [0] [2]和self.image [2] [0],它们显示正确的答案0和1。但是当完成分配任务时,对于所有i,A [0] [2]的地址似乎都正确地读为A [i] [2]。

class BImage(object):

    def __init__(self, image):
        self.image = image
        self.d1 = len(image)
        self.d2 = len(image[0]) if len(image) > 0 else 0

    # with a strange bug
    def transp_image(self):
        A = [[0]*self.d1] * self.d2
        for i in range(self.d2):
            for j in range(self.d1):
                # error:
                # when i == 0, j == 2, self.image[2][0] == 1
                # assign the value 1 to A[][2], instead of just A[0][2]
                A[i][j] = self.image[j][i]

        self.image = A
        k = self.d2
        self.d2 = self.d1
        self.d1 = k

1 个答案:

答案 0 :(得分:1)

使用list comprehension创建您的A变量。

考虑以下示例:

lst = [ [float]*2 ]*3
lst[0][0] = 3.14
print(lst)
# [[3.14, <type 'float'>], [3.14, <type 'float'>], [3.14, <type 'float'>]]

lst = [ [float]*2 for _ in range(3) ]
lst[0][0] = 3.14
print(lst)
# [[3.14, <type 'float'>], [<type 'float'>, <type 'float'>], [<type 'float'>, <type 'float'>]]

我敢肯定,这里有很多答案可以解释第一个块如何创建同一对象的三个副本,而第二个块如何生成三个唯一的对象。