“[[],[]]”和“[[]]*2”有什么区别?

5
t0 = [[]] * 2                                                                   
t1 = [[], []]                                                                   

t0[0].append('hello')                                                           
print t0                                                                        

t1[0].append('hello')                                                           
print t1             

结果是

[['hello'], ['hello']]
[['hello'], []]

但我无法区分它们的不同之处。
2个回答

10

当你执行[[]] * 2时,它会给你一个包含两个相同列表的列表,而不是两个列表。就像执行以下操作一样:

[[], []]

a = []
b = [a, a]

创建一个包含多个不同的空列表(或其他可变对象)的列表的常规方法是这样做:

t1 = [[] for _ in range(5)]

更好的做法可能是指出可变和不可变对象的区别,比如在这里展示元组和列表的行为差异? - Arafangion

7
[[]] * 2 

创建一个浅拷贝。等价于:

x = []
t0 = [x, x]

然而

t1 = [[], []]

使用两个完全不同的空列表字面量,它们是完全不同的,因此修改一个显然不会影响另一个


如果我想声明一个包含n个空列表的列表,我该怎么做? - hello.co
@user1807991 items = [[] for i in range(N)] 注意这里使用了列表推导式中的空列表字面量,以确保它们是分离的。 - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接