写入多个位置的嵌套列表?
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 个中的第一个),而不会影响其他列表。但是,它将相同的值写入:
- 0, k1
- 1, k1
- 2, k1
- 3, k1
我实际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)]
您好,我遇到了以下代码的这个非常奇怪的问题:
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 个中的第一个),而不会影响其他列表。但是,它将相同的值写入:
- 0, k1
- 1, k1
- 2, k1
- 3, k1
我实际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)]