Python列表附加行为

真的不知道如何提出问题...


假设我执行以下操作:


    >>> l = [[]]*2

    >>> l

    [[], []]

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

    >>> l

    [[1], [1]]

为什么将1附加到两个列表中?


饮歌长啸
浏览 455回答 3
3回答

慕的地8271018

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

慕虎7371278

因为实际上只有一个列表。考虑一下:>>> l = [[]]>>> l2 = l*2>>> l2[0] is l[0]True>>> l2[1] is l[0]True*2对列表执行的操作不会复制该列表,但会返回一个长度2相同的列表,并用相同的引用填充。您可能想要的是:>>> l = [[] for _ in xrange(2)]正如@Asterisk在评论中提到的那样,所有常见集合都暴露出相同的行为。因此,根据经验,最好只对具有值语义的不可变类型使用乘法。

胡子哥哥

这是我初始化列表列表的方式。行的变化最慢。nrows = 3; ncols = 5l_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 =  00 1 val =  00 2 val =  00 3 val =  00 4 val =  01 0 val =  01 1 val =  01 2 val =  01 3 val =  01 4 val =  02 0 val =  02 1 val =  02 2 val =  02 3 val =  02 4 val =  0 还值得注意的是用于索引目的for rix in range(nrows):    for cix in range(ncols):        print l_of_ls[rix][cix],    print结果0 0 0 0 00 0 0 0 00 0 0 0 0  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python