为什么我的值在分配给列表的第一个索引时会发生变化?

2024-09-28 20:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

当我将已定义函数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]]

Tags: 函数inimageforlenreturndefrange
1条回答
网友
1楼 · 发布于 2024-09-28 20:17:48

问题是使用*操作符创建的newImage列表正在创建相互引用的子列表。因此,在分配newImage[1][0]时,实际上会更改newImage[0][0]的值,因为它们相互引用。例如:

newImage = [[0] * 2] * 2

newImage[0][0] = 5
print(newImage)
# [[5, 0], [5, 0]]

newImage[1][0] = 4
print(newImage)
# [[4, 0], [4, 0]]

相反,创建初始列表时不要让子列表相互引用(您仍然可以使用*运算符将子列表中的整数值相乘,因为它们是不可变的)

newImage = [[0] * (lenHorz - 2) for _ in range(lenVert - 2)]

相关问题 更多 >