Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 我希望输出像[[0,0,0,0,],[0,1,0,0],[0,2,0,0],[0,3,0,0]]_Python_List_Loops_Nested Lists_Assign - Fatal编程技术网

Python 我希望输出像[[0,0,0,0,],[0,1,0,0],[0,2,0,0],[0,3,0,0]]

Python 我希望输出像[[0,0,0,0,],[0,1,0,0],[0,2,0,0],[0,3,0,0]],python,list,loops,nested-lists,assign,Python,List,Loops,Nested Lists,Assign,输出: time_count = [[0, 0, 0, 0]] * 4 j = 0 for i in range(len(time_count)): time_count[i][1] = j j += 1 print(time_count) time_count = [[0, 0, 0, 0]] * 4 print([[v if x!=1 else i for x,v in enumerate(a)] for i,a in enumerate(time_count)]) 我希

输出:

time_count = [[0, 0, 0, 0]] * 4
j = 0
for i in range(len(time_count)):
    time_count[i][1] = j
    j += 1
print(time_count)
time_count = [[0, 0, 0, 0]] * 4
print([[v if x!=1 else i for x,v in enumerate(a)] for i,a in enumerate(time_count)])
我希望输出结果如下:

[[0, 3, 0, 0], [0, 3, 0, 0], [0, 3, 0, 0], [0, 3, 0, 0]]
有人能解释一下为什么每个
索引[1]
都是
3

容易修复:

[[0,0,0,0],[0,1,0,0],[0,2,0,0],[0,3,0,0]] 
正如克劳斯D.所暗示的,在嵌套列表上使用
*
操作符通常是个坏主意,因为它通过复制引用来复制内容。当乘以不可变类型的序列(例如整数列表)时,您不会注意到这一点,但当元素可变时,您会得到重复项。

Do:

time_count = [[0, 0, 0, 0] for _ in range(4)]
输出:

time_count = [[0, 0, 0, 0]] * 4
j = 0
for i in range(len(time_count)):
    time_count[i][1] = j
    j += 1
print(time_count)
time_count = [[0, 0, 0, 0]] * 4
print([[v if x!=1 else i for x,v in enumerate(a)] for i,a in enumerate(time_count)])
更新: 说明:

  • 使用
    enumerate
    通过列表
    time\u count
    的索引和值进行迭代

  • 再次使用
    enumerate
    通过列表
    a
    的索引和值进行迭代。哪个是时间计数的迭代器

  • 遍历
    a
    的索引,如果
    x
    a
    的索引迭代器)为1,则说
    i
    (时间计数的索引迭代器)),否则说
    a
    的索引迭代器)


  • 注意:这都是在列表理解中,*操作符只是创建了对原始列表的新引用(此处
    [0,0,0,0]

    如果将原始列表更改为
    time\u count[i][1]=j
    ,则所有引用都反映相同的更改

    如果要创建新列表,可以使用带有循环的extend方法:

    [[0, 0, 0, 0], [0, 1, 0, 0], [0, 2, 0, 0], [0, 3, 0, 0]]
    

    现在,时间计数中的所有元素列表存储单独的内存,可以有不同的值。

    将列表写为[[0,0,0,0]]*4是不好的。列表是可变的。每次更改任何列表元素时,其所有副本都将更改。一种很好的编写方法如下所示,因为这样您就不会复制列表元素

    time_count = []
    time_count.extend([0,0,0,0] for _ in range(4))
    

    基本上,列表的实体是指向特定内存位置的指针。当将列表(a)分配给列表(b)时,意味着列表(b)指向与列表(a)相同的内存位置

    在上面的问题中,如果嵌套列表的内部乘以4倍,那么所有子列表都指向相同的内存位置。因此,如果其中一个子列表被更改,那么更改将传播到所有子列表,这基本上会在代码执行时产生意外的结果。对于任何有兴趣了解更多的人, 视频总结了列表中所有不明显的基本特征。它还进一步详细解释了上述问题。

    操作员创建对(相同)列表的新引用。如果你改变一个,你就是在改变所有。太棒了!!我明白了,但是我怎么能不把每一个元素都写下来就创建一个长长的列表呢?兄弟!你能用通俗易懂的英语把上面的书面陈述分解一下吗?这到底是什么意思???@BitPitter编辑了我的答案