当我尝试将存储在列表列表中的值复制到另一个列表列表时,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
答案 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'>]]
我敢肯定,这里有很多答案可以解释第一个块如何创建同一对象的三个副本,而第二个块如何生成三个唯一的对象。