当我将已定义函数ThreeByThree
的返回值分配给newImage
列表的第一个([0][0]
)索引时,该函数的返回值会发生变化,并加1。但是,连续指定是有效的。请查看我的打印报表结果
def boxBlur(image):
lenVert = len(image)
lenHorz = len(image[0])
newImage = [[0] * (lenHorz - 2)] * (lenVert - 2)
def ThreeByThree(a,b,image):
k = 0
total = 0
for i in range(a, a + 3):
for j in range(b, b + 3):
k = image[i][j]
total += k
return int(total / 9)
for i in range(0, lenVert - 2):
for j in range(0, lenHorz - 2):
print(ThreeByThree(i, j, image))
newImage[i][j] = ThreeByThree(i, j, image) # This is where the assignment goes wrong
return newImage
image = [[7, 4, 0, 1],
[5, 6, 2, 2],
[6, 10, 7, 8],
[1, 4, 2, 0]]
print(boxBlur(image))
预期产出:
5
4
4
4
[[5, 4], [4, 4]]
输出:
5
4
4
4
[[4, 4], [4, 4]]
问题是使用
*
操作符创建的newImage
列表正在创建相互引用的子列表。因此,在分配newImage[1][0]
时,实际上会更改newImage[0][0]
的值,因为它们相互引用。例如:相反,创建初始列表时不要让子列表相互引用(您仍然可以使用
*
运算符将子列表中的整数值相乘,因为它们是不可变的)相关问题 更多 >
编程相关推荐