在Python中将变量列表附加到列表中

时间:2014-02-11 19:15:20

标签: python

今天,我们被要求编写一个Python文件,要求用户输入一个正整数并打印列表:

[[1], [1, 2], [1, 2, 3],..., [1, 2, 3,..., n]]

这是我的代码:

A=[]
n=int(input("Input a positive integer:"))
if n>0: A=[[1]]
B=[1]
for i in range(2,n+1):
   B+=[i]
   A+=[B]
print(A)

这似乎可行。但它没有给我结果:

[[1], [1, 2, 3,..., n], [1, 2, 3,..., n],..., [1, 2, 3,..., n]]

它似乎取代了附加在A上的新“B”的“B”。 我真的不明白为什么会那样做。这里有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:1)

执行A+=B时,您正在创建对可变对象B的引用。 +=操作会创建引用,而不是副本。尝试将其更改为A+=B[:] - 这是复制列表内容的简便简写。

答案 1 :(得分:0)

这是因为您向A插入的是引用到B,您没有创建n个单独的列表。 这意味着当您修改B时,您修改它的所有引用,即列表A中的所有条目(第一个是单独的列表除外)。

以下代码有效:

n=int(input("Input a positive integer:"))
A=[range(1, i+1) for i in range(2, n+1)]
print(A)

答案 2 :(得分:0)

另一种方法(在Python 3中,对于范围/ xrange考虑):

A = []
n = int(input("Input a positive integer: "))
for i in map(lambda s: range(1, s+1), range(1, n+1)):
    A.append(list(i))

对于你的班级来说,像map和lambdas这样的概念可能过于先进,但以防万一。

答案 3 :(得分:-1)

这应该有效:

A=[]
n=int(input("Input a positive integer:"))
if n>0:
    A = [[1]]

i = 2

while i <= n:
    B = range(1,i+1)
    A.append(B)
    i = i+1
print(A)

答案 4 :(得分:-1)

您不小心了解了副本和深层副本之间的区别。

在内部,您的列表显示[1,B,B,B ..... B]。

基本上A + = [B]插入对B的引用,而不是B的值。

一个解决方案是:

导入deepcopy #at代码顶部

A + = [deepcopy.deepcopy(B)] #disclaimer:我是从记忆中做到这一点

另一个解决方案是A + = [A [-1] + [i]] #get完全摆脱变量B

这是有效的,因为值A [-1] + [i]未被任何其他变量引用。

我确定您的原始代码失败的原因将在您的课程中更深入地介绍。如果你想要,你可以暂时忽略它作为一个有趣的小“虫子”。