我有问题。首先让我向您展示代码:
def neon(l):
oc = 0; #naj ocena
tz = 0; #teraz ocena
#sprawdzanie poziomo
for x in range(len(l[0])):
for i in range(len(l[x])):
for y in range(i + 1,len(l[x])):
tz = l[x][i] + l[x][y] + (max(y - x, x - y) + 1) * 2;
if (tz > oc):
oc = tz;
pion = [[0] * len(l[0])] * len(l);
print(pion);
print("#######");
for i in range(len(pion)):
for y in range(len(pion[i])):
pion[i][y] = l[y][i];
print(pion);
neon([[1,2,1,2],[7,1,7,1],[1,1,1,1],[3,3,3,3]]);
问题在于,当我尝试处理pion[i][y]
而不是仅仅将该值从0更改为任何值时,程序将使用第二个索引y更改所有内部数组中的值。看起来是这样:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
#######
[[1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3]]
[[2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3]]
[[1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3], [1, 7, 1, 3]]
[[2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3], [2, 1, 1, 3]]
它应该是:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
#######
[[1, 7, 1, 3], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 7, 1, 3], [2, 1, 1, 3], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 7, 1, 3], [2, 1, 1, 3], [1, 7, 1, 3], [0, 0, 0, 0]]
[[1, 7, 1, 3], [2, 1, 1, 3], [1, 7, 1, 3], [2, 1, 1, 3]]
请帮助并提前谢谢您。
答案 0 :(得分:1)
由于以下原因而发生此问题:
pion
是内部列表的列表。 pion的每个元素仅保留对一个内部列表的引用。pion
(使用pion = [[0] * len(l[0])] * len(l)
的方式),pion
的所有元素都将引用保留到同一内部列表。因此,在pion
中,您没有多个不同的内部列表,而只对一个内部列表具有多个引用。换句话说,pion[0]
,pion[1]
,pion[2]
等都是对相同的内部零列表的引用。您使用特定行索引(例如,使用表达式pion[3]
)对此内部列表所做的任何修改,也将在所有其他行索引中可见,因为在所有行索引中,您只是保持对相同内部列表的引用。要纠正此问题,您需要以其他方式创建和初始化列表。例如,如果rows
和cols
分别是行数和列数,则可以执行以下操作:
pion = [([0]*cols) for i in range(rows)]