我想用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"
。
有人可以告诉我为什么使用第一种方法会给出这个输出吗?
答案 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.)