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

标签 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

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

[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]

最后一行让我非常困惑。在我看来,这两个打印语句应该给出相同的结果。我的变量 seq 是如何分配给那个长列表的?最后一个列表甚至不满足分配 seq 的 if 语句的要求。我确定这是一些非常愚蠢的大脑放屁,但我就是想不通我搞砸了什么

最佳答案

seq = chain 创建另一个 reference 到同一个 chain 列表。然后您打印该列表,但循环不会停止

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

你在这里继续扩展chain:

chain += [primes[secnum]]

这使用 augmented assignment ;它不会创建新列表,而是扩展现有列表。它等效于 chain.extend(primes[secnum])

您可以通过创建chain副本 来存储在seq 中来解决此问题:

seq = chain[:]

关于python - 对变量赋值感到困惑 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34901867/

相关文章:

python - python如何解释带有前导零的数字

python - Django 模型中没有这样的列错误

java - 有效地搜索 "close point"

c++ - 如何在不循环的情况下仅计算数字的二进制表示形式中的 1 位

algorithm - 寻找连续的数列

python - "the choice must be consistent for all consumers"是什么意思?

python - 如何在 python 请求中获取 cookie 信息?

algorithm - 随机优先搜索?

用小方 block 填充矩形的算法?

python - 使用 python 通过 BBB 读取多个超声波传感器