繁体   English   中英

python列表的意外输出

[英]Unexpected output of python list

我是python的新手,正在尝试运行以下代码:

m=int(raw_input())
l=[[0]*2]*m
for i in range(0,m):
    for j in range(0,2):
        l[i][j]=raw_input()
        print l
        print "-------"

输出:

3
1
[['1', 0], ['1', 0], ['1', 0]]
-------
2
[['1', '2'], ['1', '2'], ['1', '2']]
-------
3
[['3', '2'], ['3', '2'], ['3', '2']]
-------
4
[['3', '4'], ['3', '4'], ['3', '4']]
-------
5
[['5', '4'], ['5', '4'], ['5', '4']]
-------
6
[['5', '6'], ['5', '6'], ['5', '6']]

但是,当我空运行该程序时,预期输出应为

3
1
[['1', 0], ['1', 0], ['1', 0]]
-------
2
[['1', '2'], ['1', '2'], ['1', '2']]
-------
3
[['1', '2'], ['3', '2'], ['1', '2']]
-------
4
[['1', '2'], ['3', '4'], ['1', '2']]
-------
5
[['1', '2'], ['3', '4'], ['5', '2']
-------
6
[['1', '2'], ['3', '4'], ['5', '6']]

在每个迭代列表被重新分配后,其效果类似,但是当我递增“ i”时,列表元素应类似于预期的输出。 请我需要帮助。

s * n, n * s    ==>   n shallow copies of s concatenated 

请注意,副本较浅; 嵌套结构不会被复制。
这常常困扰着新的Python程序员。 考虑:

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

您可以将代码更改为:

l = [[0 for i in range(2)] for j in range(m)]

l=[[0]*2]*m [[0]] * 3导致列表[0] 3 *浅拷贝*,而不是三个单独的列表。 编写代码的更好方法是随便构造列表。 请注意,您不需要指定范围的开始为0。此外,在python2, xrange快得多 range ,所以TIS很好的做法,而不是使用它。

m=int(raw_input())
l=[]
for i in xrange(m):
    l.append([])
    for j in xrange(2):
        l[i].append(raw_input())
        print l
        print "-------"

您也可以使用生成器并遍历列表进行操作:

m=int(raw_input())
l=[[0, 0] for _ in range(m)]
for sub_list in l:
    for j in xrange(2):
        sub_list[j] = raw_input()
        print l
        print "-------"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM