python列表并扩展

时间:2018-07-27 02:06:48

标签: python list memory numbers

我一直在使用其他语言,最近正在尝试学习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”?

1 个答案:

答案 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]