Python 类型错误:';int';对象不支持项分配。为什么?
为什么我会犯这个错误?我试图将图像输出为RGB值的嵌套列表。Python初学者顺便说一句Python 类型错误:';int';对象不支持项分配。为什么?,python,python-3.x,python-imaging-library,Python,Python 3.x,Python Imaging Library,为什么我会犯这个错误?我试图将图像输出为RGB值的嵌套列表。Python初学者顺便说一句 def imgRGB(im): width, height = im.size #create matrix matrix = [] for i in range(height): matrix.append([0, 0, 0] * width) #get the rgb values
def imgRGB(im):
width, height = im.size
#create matrix
matrix = []
for i in range(height):
matrix.append([0, 0, 0] * width)
#get the rgb values
for x in range(width):
for y in range(height):
r,g,b = im.getpixel((x,y))
matrix[x][y][0] = r
matrix[x][y][1] = g
matrix[x][y][2] = b
return matrix
[0,0,0]*width
是一个包含3*width
整数的列表,而不是三元素列表的列表
你想要
matrix.append([[0,0,0] for _ in range(width)])
相反。你会得到这个错误,因为你试图对一个只有两层深的结构进行三层查找 要使结构保持两层深度并修复代码,您的代码可能如下所示:
def imgRGB(im):
width, height = im.size
#create matrix
matrix = []
for i in range(height):
matrix.append([0, 0, 0] * width)
#get the rgb values
for x in range(width):
for y in range(height):
r,g,b = im.getpixel((x,y))
matrix[x][y*3+0] = r
matrix[x][y*3+1] = g
matrix[x][y*3+2] = b
return matrix
顺便说一句,就我个人而言,我会使用一维numpy数组作为矩阵
,而不是任何类型的Python列表,并使用矩阵[(y*高度)+x+亚像素偏移量]
,其中亚像素偏移量
对于r/g/b是0/1/2。或者,根据您的访问模式,您可以将r/g/b偏移放在不同的位置,然后乘以(x*y)
无论哪种方式,所需的内存分配和垃圾收集都要少得多,进行访问只需要(非常快的)指针算法。您的
矩阵是二维的。你要做三次查找。因此,最后一次查找试图将整数视为一个列表……也就是说,[0,0,0]*2
结果是[0,0,0,0,0]
,而不是[[0,0,0],[0,0,0]]
…这没什么错——更平坦的数据结构通常比嵌套的好——但您的查找和修改代码需要注意这一点。谢谢。现在我得到了:indexer-ror:list-index超出范围为什么?x
迭代高度,而不是宽度。谢谢。我想稍后用PIL(低)输出它(修改),所以我使用了这个方法。。。我会尽量让它这样工作。优化将在稍后进行:)