Anaconda Spyder中二维列表赋值异常问题求助
问题根源:二维列表的错误初始化方式
你遇到的这个bug其实是Python中创建二维列表时的一个经典陷阱——用*重复子列表的时候,所有子列表其实都是同一个列表对象的引用。
为什么会出现这个问题?
看你初始化A的代码:
A = [[0]*self.d1] * self.d2
这里[0]*self.d1会创建一个包含self.d1个0的列表,然后* self.d2只是把这个列表的引用重复了self.d2次。也就是说,A里的每一个A[i]指向的都是同一个列表。所以当你执行A[i][j] = self.image[j][i]时,你其实是在修改那个唯一的子列表,自然所有A[i][j]都会跟着变。
怎么修复?
你需要用列表推导式来创建二维列表,这样每一个子列表都是独立的新对象:
A = [[0]*self.d1 for _ in range(self.d2)]
这个写法会循环self.d2次,每次都创建一个新的[0]*self.d1列表,这样A里的每个子列表都是独立的,修改其中一个不会影响其他。
修复后的完整代码
把你的transp_image方法改成这样:
def transp_image(self): # 用列表推导式创建独立的子列表 A = [[0]*self.d1 for _ in range(self.d2)] for i in range(self.d2): for j in range(self.d1): A[i][j] = self.image[j][i] self.image = A k = self.d2 self.d2 = self.d1 self.d1 = k
验证一下
比如假设原来的self.image是:
[[0,0,0], [0,0,0], [1,0,0]]
修复前执行A[0][2] = 1会让所有A[i][2]都变成1,修复后只会让A[0][2]变成1,其他子列表的对应位置不受影响,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

