我是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'时,list元素应该像预期的输出一样。我需要帮助..
答案 0 :(得分:6)
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)]
答案 1 :(得分:2)
行l=[[0]*2]*m
中的问题。执行[[0]] * 3
会导致列表[0]
的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 "-------"