列表复制操作id值相同,但重新赋值后没有全变

列表复制操作id值相同,但重新赋值后没有全变



[Copy to clipboard] [ - ]
CODE:
row = [0] * 4
print row
for i in range(4):
    print id(row[i]),
print
table = [row] * 4
print table
print id(row), id(table)
for i in range(4):
    print id(table[i]),
print
for i in range(4):
    for j in range(4):
        print id(table[i][j]),
    print
table[2][3] = 7
print table

最后输出table[i ][j]的id值,都是row[i ]一样的值,但修改table[2][3]的值后,为什么不是所有的table[i ][j]都变成7呢?

因为row = [0] * 4
id(row[any index])都会是一样的,这是由于Python对同样的数据只分配一次PyObject 标识


table = [row] * 4
id(table[any index])也都会一样,但id(table[any index]) != id(row[any index])
因为row[any index]为一个常数 table[any index]为一个列表是不同的两个数据,所以不同PyObject 标识
所以我想你明白table[any index][any index] 就是相当于指到了row[any index]的那个常数
那你table[2][3] = 7,这就产生了新的一个PyObject 标识,而其它的,比如table[1][1]还会是0
顶一个,受益匪浅