编辑列表列表中的项目时出现问题

时间:2014-03-27 09:09:14

标签: python list python-2.7

我想用pythons创建一个列表列表,我知道有两种方法可以做到。

第一种方法是这样的:

l = []
l_in = []
for j in range(2):
   l_in.append("1")
print l_in
for i in range(2):
   l.append(l_in)
print l

,第二种方法是:

l = []
for i in range(2):
   l.append([1]*2)
print l

这两种方法都会创建一个列表

l = [['1', '1'], ['1', '1']] 

我只想更改元素int此列表中的(1,1)元素。如果我做

l[1][1] = "Something I want to replace with"

应该替换元素。这适用于第二种方法。但是,如果我使用第一种方法,则(1,1)(0,1)都会更改为"Something I want to replace with"

有人可以告诉我为什么使用第一种方法会给出这个输出吗?

1 个答案:

答案 0 :(得分:4)

这是因为在第一种方法中,在第二个循环中,您将两次附加相同的列表。

for i in range(2):
    l.append(l_in)

现在,无论何时修改l中的元素,实际上都在修改一个列表中的元素。一种简单的理解方法是查看内置id()l的内容提供的值。

>>> map(id, l)
[32750120, 32750120]

您可以看到l中的两个元素共享相同的ID(以及相同的内存地址)。它们都引用相同的列表l_in

正如winiचhaudhary建议的那样,一个简单的解决方法是l.append(l_in[:]) [:]创建列表l_in的副本。

l = []
l_in = []
for j in range(2):
   l_in.append("1")
print l_in
for i in range(2):
   l.append(l_in[:])
print l

您还可以使用列表和生成器推导创建列表列表。以下是一些例子:

# empty lists..
>>> [[] for _ in range(4)]
[[], [], [], []]

# generator expression..
>>> list([] for _ in range(4))
[[], [], [], []]

# [1, 1] for each sublist.
>>> list([1, 1] for _ in range(4))
[[1, 1], [1, 1], [1, 1], [1, 1]]

以下是help()上的id()

Help on built-in function id in module __builtin__:

id(...)
    id(object) -> integer

    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory address.)