Python:奇怪的列表索引行为

时间:2014-07-24 15:30:04

标签: python list

我正在创建列表列表。当我选择特定索引时,它会同时设置多个列表条目。这是怎么回事?

x = []
for i in range(3,6+1,1):
    x.append([['','']] * i)

x[0][0][0] = 1
for col in x:
    print col

输出:

[[1, ''], [1, ''], [1, '']]
[['', ''], ['', ''], ['', ''], ['', '']]
[['', ''], ['', ''], ['', ''], ['', ''], ['', '']]
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']]

关于为什么不起作用仍然是一个悬而未决的问题......这是一个解决方案,但是......

x = []
for i in range(3,6+1,1):
    y = ['','']
    tmp = []
    for j in range(i):
        tmp.append(y[:])
    x.append(tmp)

x[0][0][0] = 1
for col in x:
    print col

输出:

[[1, ''], ['', ''], ['', '']]
[['', ''], ['', ''], ['', ''], ['', '']]
[['', ''], ['', ''], ['', ''], ['', ''], ['', '']]
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']]

1 个答案:

答案 0 :(得分:2)

当您将列表相乘时,会重复使用对象,因此当您修改其中一个对象时,您似乎会修改" all"他们事实上,只有一个内部列表,但它出现在外部列表的多个位置!

>>> x = []
>>> x.append([['','']] * 3)
>>> x
[[['', ''], ['', ''], ['', '']]]
>>> x[0][0][0] = 1
>>> x
[[[1, ''], [1, ''], [1, '']]]

如果单独创建内部列表,以便它们是不同的对象,则不会出现此问题:

>>> x = [[]]
>>> x[0].append(['',''])
>>> x[0].append(['',''])
>>> x[0].append(['',''])
>>> x
[[['', ''], ['', ''], ['', '']]]
>>> x[0][0][0] = 1
>>> x
[[[1, ''], ['', ''], ['', '']]]

如果使用理解创建列表,则还可以避免此问题,例如:

x = [[['',''] for _ in range(3)]]