Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表附加行为_Python_List - Fatal编程技术网

Python列表附加行为

Python列表附加行为,python,list,Python,List,我真的不知道如何表述这个问题 假设我执行以下操作: >>> l = [[]]*2 >>> l [[], []] >>> l[0].append(1) >>> l [[1], [1]] 为什么1会被附加到两个列表中?[[]]*2是一个包含对同一列表的两个引用的列表。您将添加到它,然后再查看两次。因为实际上只有一个列表。考虑这一点: >>> l = [[]] &

我真的不知道如何表述这个问题

假设我执行以下操作:

    >>> l = [[]]*2
    >>> l
    [[], []]
    >>> l[0].append(1)
    >>> l
    [[1], [1]]

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

[[]]*2
是一个包含对同一列表的两个引用的列表。您将添加到它,然后再查看两次。

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

>>> 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 = 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 
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0  
为了编制索引,也值得注意

for rix in range(nrows):
    for cix in range(ncols):
        print l_of_ls[rix][cix],
    print
结果

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 
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0  

展示内存布局的差异:

listOfLists = [[]] * 3
listOfListsRange = [[] for i in range(0, 3)]

这一问题将分别在。似乎对字典执行的*2也不复制。。。