我一直在使用其他语言,最近正在尝试学习python。 我目前在Linux上使用python 3.5.2。
今天,我正在尝试了解列表的工作方式。我正在做的是尝试将列表本身乘以一个数字
def factor(x):
f = []
for i in range(1, x + 1):
if x % i == 0:
f.append(int(i))
return f
c = 3
f = factor(10)
k = f
k.extend(c*i for i in f)
我期望的是
f = [1, 2, 5, 10]
k = [1, 2, 5, 10, 3, 6, 15, 30]
但是我的RAM掉了下来,最终冻结了我的计算机。出于某些原因
k = list(f)
k.extend(x*i for i in f)
我明白了
k = [1, 2, 5, 10, 3L, 6L, 15L, 30L]
在我的情况下,我认为f已经是一个列表。那为什么还要再次列出list(f)?
我的RAM为何突然超出列表(f)?
为什么数字后面有“ L”?
答案 0 :(得分:0)
RAM疯狂的原因是,在扩展f
时,您正在f
上进行操作。因此,您正在创建一个无限循环。您可以这样操作f
的副本:
In [2]: f = [1, 2, 5, 10]
In [3]: f.extend(i*3 for i in f.copy())
In [4]: f
Out[4]: [1, 2, 5, 10, 3, 6, 15, 30]
您正在使用以下行在代码中进行复制:k = list(f)
,这就是该版本而不是其他版本起作用的原因。
如果仅执行k = f
,则k和f本质上都指向同一列表。
像这样检查它:
f = [1, 2, 3]
k = f
k.append(4)
print(f)
print(k)
两者的输出均为[1, 2, 3, 4]
。
但是要这样做:
f = [1, 2, 3]
k = f.copy() # or list(f)
k.append(4)
print(f)
print(k)
输出:
[1, 2, 3]
[1, 2, 3, 4]