python中如何追加_Python:如何在列表列表中追加新元素?

这是一个非常简单的程序:

a = [[]]*3

print str(a)

a[0].append(1)

a[1].append(2)

a[2].append(3)

print str(a[0])

print str(a[1])

print str(a[2])

这是我期待的输出:

[[], [], []]

[1]

[2]

[3]

但相反,我得到了这个:

[[], [], []]

[1, 2, 3]

[1, 2, 3]

[1, 2, 3]

我真的没有到达这里!

您应该使用列表列表而不是标题推断列表(相同)列表。

你必须这样做

a = [[] for i in xrange(3)]

a = [[]]*3

它现在有效:

$ cat /tmp/3.py

a = [[] for i in xrange(3)]

print str(a)

a[0].append(1)

a[1].append(2)

a[2].append(3)

print str(a[0])

print str(a[1])

print str(a[2])

$ python /tmp/3.py

[[], [], []]

[1]

[2]

[3]

当您执行类似a = [[]]*3的操作时,您会在列表中三次获得相同的列表[]。同样意味着当您更改其中一个时,您将更改所有这些(因为只有一个列表被引用三次)。

您需要创建三个独立列表来规避此问题。你可以通过列表理解来做到这一点。您在此构造一个由独立空列表[]组成的列表。将为xrange(3)上的每次迭代创建新的空列表(在这种情况下,range和xrange之间的差异不是那么重要;但xrange稍微好一点,因为它不会产生完整的列表数字,只返回一个迭代器对象)。

用解释和使用xrange会更好

@okm,除非是python 3x :)

您的方法的基本问题是,当您将列表乘以3时,结果列表包含三个相同的列表。所以a[0],a[1]和a[2]都引用相同的东西。当您附加到其中任何一个时,您将附加到相同的列表。这就是为什么append()调用的效果似乎是三倍的原因。

而是生成列表列表而不引用相同的列表。例如,您可以使用列表推导,就像这样。

[[] for i in range(3)]

当你写:

a = [[]]*3

您不会制作内部空列表的3个副本,而是对同一个对象进行3次引用。

同样的,如果你这样做:

b = [1,2,3]

c = b

c.append(4)

print b

你得到输出:

[1, 2, 3, 4]

这是因为b和c是两个不同的引用(可以说两个不同的名称)到同一个列表。您可以从任何引用更改对象,但是您将看到所有引用的结果,因为它们指向相同的内容。

这将给你一个清晰的想法,在l所有对象具有相同的id()并且所有对象都是可变的,因此编辑它们中的任何一个也将自动编辑其他对象,因为它们都只是引用id = 18671936的相同对象并且m都有不同的id(),所以它们都是不同的对象。

>>> l = [[]]*4

>>> for x in l:

print(id(x))

18671936

18671936

18671936

18671936

>>> m=[[],[],[],[]]

>>> for x in m:

print(id(x))

10022256

18671256

18672496

18631696

所以,你应该像这样创建你的列表:

>>> a=[[] for _ in range(4)]

>>> a[0].append(1)

>>> a[2].append(5)

>>> a

[[1], [], [5], []]

There is really something I do not get here !

a = [[]]*3这里的问题是您将列表设置为相同的引用,因为数组和字典都存储为引用。

>>> a = [[]]*3

>>> a[0] is a[1] or a[0] is a[2]

True

>>> a[0] is a[1] or a[0] is a[2] or a[1] is a[2]

True

>>>

如果你做= [{}] * 3`就会发生同样的事情

因此,您必须小心,您可以执行列表推导[[] for _ in xrange(3)]或静态定义所有3个数组[[], [], []]。

>>> a = [[] for _ in xrange(3)]

>>> a[0] is a[1] or a[0] is a[2] or a[1] is a[2]

False

>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值