为了账号安全,请及时绑定邮箱和手机立即绑定

Python列表附加行为

Python列表附加行为

饮歌长啸 2019-12-05 15:58:29
真的不知道如何提出问题...假设我执行以下操作:    >>> l = [[]]*2    >>> l    [[], []]    >>> l[0].append(1)    >>> l    [[1], [1]]为什么将1附加到两个列表中?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

[[]]*2是对同一列表的两个引用的列表。您要附加它,然后看到它两次。


查看完整回答
反对 回复 2019-12-05
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

因为实际上只有一个列表。考虑一下:


>>> l = [[]]

>>> l2 = l*2

>>> l2[0] is l[0]

True

>>> l2[1] is l[0]

True

*2对列表执行的操作不会复制该列表,但会返回一个长度2相同的列表,并用相同的引用填充。


您可能想要的是:


>>> l = [[] for _ in xrange(2)]

正如@Asterisk在评论中提到的那样,所有常见集合都暴露出相同的行为。因此,根据经验,最好只对具有值语义的不可变类型使用乘法。


查看完整回答
反对 回复 2019-12-05
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这是我初始化列表列表的方式。行的变化最慢。


nrows = 3; ncols = 5


l_of_ls = [[0]*ncols for i in range(nrows )]


for rix, r in enumerate(l_of_ls):

    for cix, c in enumerate(r):

        print rix, cix, 'val = ',c

结果


0 0 val =  0

0 1 val =  0

0 2 val =  0

0 3 val =  0

0 4 val =  0

1 0 val =  0

1 1 val =  0

1 2 val =  0

1 3 val =  0

1 4 val =  0

2 0 val =  0

2 1 val =  0

2 2 val =  0

2 3 val =  0

2 4 val =  0 

还值得注意的是用于索引目的


for rix in range(nrows):

    for cix in range(ncols):

        print l_of_ls[rix][cix],

    print

结果


0 0 0 0 0

0 0 0 0 0

0 0 0 0 0  


查看完整回答
反对 回复 2019-12-05
  • 3 回答
  • 0 关注
  • 453 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信