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

sak*_*ana 4 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 = []

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
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到了

[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]
Run Code Online (Sandbox Code Playgroud)

最后一行对我来说非常困惑.在我看来,两个印刷语句应该给出相同的结果.我的变量seq是如何分配给那个长列表的?最后一个列表甚至不满足分配了seq的if语句的要求.我敢肯定这是一个非常愚蠢的脑屁,但我无法弄清楚我搞砸了什么

Mar*_*ers 7

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

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

你继续在chain这里扩展:

chain += [primes[secnum]]
Run Code Online (Sandbox Code Playgroud)

这使用增强赋值 ; 它不会创建新列表,而是扩展现有列表.它相当于chain.extend(primes[secnum]).

您可以通过创建一个解决这个副本chain存储在seq:

seq = chain[:]
Run Code Online (Sandbox Code Playgroud)