今天,我们被要求编写一个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”。 我真的不明白为什么会那样做。这里有人可以向我解释一下吗?
答案 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]未被任何其他变量引用。
我确定您的原始代码失败的原因将在您的课程中更深入地介绍。如果你想要,你可以暂时忽略它作为一个有趣的小“虫子”。