python列表的意外输出

python列表的意外输出,python,list,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', '

我是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
会生成3个列表的*浅拷贝*,而不是三个单独的列表。编写代码的一种更好的方法是在运行时构造列表。请注意,不需要将范围的起点指定为0。另外,在python2中,
xrange
range
快得多,因此最好改用它

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

但是变量i的范围是从0到m,所以在第一次迭代中,列表l的第一个元素,即l[0][0]=1和l[0][1]=2是正确的,但在第二次迭代中,l[1][0]=3和l[1][1]=4是正确的,但为什么在“i”的第二次迭代中l[0][0]和l[0][1]的值会发生变化?@sum2000,因为(如他所述)内部列表没有被复制。您的
l
只是一个列表,存储对同一个2元素列表的
m
引用。
l[0][0]、l[1][0]、l[2][0]
指向内存中的同一对象。