对变量赋值感到困惑(Python)

对变量赋值感到困惑(Python),python,algorithm,Python,Algorithm,对于ProjectEuler上的一项任务,我编写了一段代码,使用蛮力查找100以下最长的素数链,这些素数加起来就是一个素数,并且代码给出了正确的结果。所以对于100以下的数字,答案是2+3+5+7+11+13=41 import math def prime(n): for x in xrange(2,int(math.sqrt(n)+1)): if n%x == 0: return False return True primes =

对于ProjectEuler上的一项任务,我编写了一段代码,使用蛮力查找100以下最长的素数链,这些素数加起来就是一个素数,并且代码给出了正确的结果。所以对于100以下的数字,答案是2+3+5+7+11+13=41

import math

def prime(n):
    for x in xrange(2,int(math.sqrt(n)+1)):
        if n%x == 0:
            return False
    return True

primes = []

for x in xrange(2,100):
    if prime(x):
        primes += [x]

record = 0
i = 0

for num in primes:
    i += 1
    chain = [num]
    for secnum in xrange(i,len(primes)-1):
        chain += [primes[secnum]]
        if len(chain) > record and sum(chain) in primes:
            record = len(chain)
            seq = chain
            print seq

print seq
当我运行这段代码时,我得到

[2, 3]
[2, 3, 5, 7]
[2, 3, 5, 7, 11, 13]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89]

最后一句话让我非常困惑。在我看来,这两个打印语句应该给出相同的reult。我的变量seq是如何分配给那个长列表的?最后一个列表甚至不符合指定seq的if语句的要求。我肯定这是一个愚蠢的大脑放屁,但我就是搞不清楚我搞砸了什么

seq=chain
创建了对同一
chain
列表的另一个引用。然后打印该列表,但循环不会停止

您继续展开
,由于
seq
只是对该列表的引用,因此循环结束后您将看到这些更改。在循环迭代的剩余
期间,链
/
seq
继续更改,但不再满足
if
条件,因此您看不到这些更改发生

您可以在此处继续展开链:

chain += [primes[secnum]]
这使用;它不创建新列表,而是扩展现有列表。它相当于
chain.extend(primes[secnum])

您可以通过创建一个
的副本来修复此问题,并将其存储在
seq
中:

seq = chain[:]

在python中,可以使用+运算符将两个列表连接在一起。 所以[1]+[2]将产生[1,2]

    chain += [primes[secnum]]
    if len(chain) > record and sum(chain) in primes:
        record = len(chain)
        seq = chain
        print seq

通过将链(列表)连接到另一个列表的+=运算符,链变量变得更大。所以它会变大,当你打印seq时,因为seq等于chain now,你会得到最新的结果。

你的解释只有在我已经知道答案的情况下才有意义。一点也不清楚。