python二维列表赋值发生意外错误

1.我想建一个二维列表,数据如下图所示:

0 inf inf inf inf inf
inf 0 inf inf inf inf
inf inf 0 inf inf inf
inf inf inf 0 inf inf
inf inf inf inf 0 inf
inf inf inf inf inf 0

2.python代码如下:

    n = 6
    m = [[0] * n] * n
    for i in range(n):
        j = 0
        while j < n:
            print(str(i)+'\t'+str(j))
            if i != j:
                print('before\t'+str(m[0][0]))
                m[i][j] = float('inf')
                print('after\t'+str(m[0][0]))
            j += 1

3.程序在执行第二次外部循环时(也就是i=1,j=0),本该执行m(1,0)=float('inf'),但
m(0)(0)的值却发生了改变。这是为什么?
0 5
before 0
after 0
1 0
before 0
after inf

阅读 2.5k
3 个回答

1楼正解。虽然你的列表是6*6的,但是6行元素是通过复制引用得到的,相当于6个引用指向的同一个值,所以,改其中一个引用,六行都会发生变化。
更改后的代码如下:

n = 6
# m = [[0] * n] * n
m = [[0] * n for row in range(n)]
for i in range(n):
    j = 0
    while j < n:
        print(str(i) + '\t' + str(j))
        if i != j:
            print('before\t' + str(m[0][0]))
            m[i][j] = float('inf')
            print('after\t' + str(m[0][0]))
        j += 1
新手上路,请多包涵

m = [[0] n] n 返回的结果是将内部列表的引用复制n次,应改为 m=[[0]*n for row in range(n)]

[[0] * n] * n 定义列表a元素引用了同一个列表b,
在当列表b的元素变更时,表现上列表a的6个(实际都是引用同一个)元素列表全变了,不好理解的话画成引用图就很明白了
可以这样定义

n = 6
m = [0 if i==j else 'inf' for i in range(n) for j in range(n)]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏