写入多个位置的嵌套列表?

Writing to nested list writing in multiple spots?

您好,我遇到了以下代码的这个非常奇怪的问题:

def splice_into_blocks(s,bs):
    blocklist = []
    if (len(s)%bs):
        s = s+'0'*(bs-len(s)%bs)
    for i in range((len(s)/bs)+1):
        blocklist.append(list(s[bs*(i):bs*(i+1)]))
    del blocklist[-1]
    return blocklist


bl = splice_into_blocks(crypt, 4)
# print bl

def byte_transpose(blocklist):
    bs = len(blocklist[0])
    blocklist_t = [['0']*len(blocklist)]*bs
    for k1,i in enumerate(blocklist):
        # for k2,j in enumerate(i):
        #     blocklist_t[k2][k1] = j
        blocklist_t[0][k1] = i[0]
    print blocklist_t

byte_transpose(bl)

具体在行

blocklist_t[0][k1] = i[0]

我的直觉是,这只会写入 blocklist_t 中索引为 0 的列表(所以在我的例子中,是 4 个中的第一个),而不会影响其他列表。但是,它将相同的值写入:

我实际objective是用我注释掉的那两行转置这个内嵌列表

感谢任何帮助。

运算符 * 列出了 bs 对列表 [['0']*len(blocklist)] 的引用 ,而不是 bs 副本,共[['0']*len(blocklist)]。也就是说,只有一个[['0']*len(blocklist)]引用,如blocklist_t[0]blocklist_t[1]等,你需要的是:

blocklist_t = [['0']*len(blocklist) for i in range(bs)]