对于变量赋值(Python)感到困惑
对于变量赋值(Python)感到困惑
对于ProjectEuler上的一个任务,我编写了一段代码,使用暴力方法找到小于100的最长的质数链,这些质数链的和也是一个质数,而且代码确实给出了正确的结果。所以对于小于100的数字,答案是2 + 3 + 5 + 7 + 11 + 13 = 41
当我运行这段代码时,我得到了下面的结果:
[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]
最后一行对我来说非常困惑。在我看来,这两个print语句应该给出相同的结果。我的变量seq是如何被赋值为那个长列表的呢?最后一个列表甚至不满足if语句中赋值给seq的条件。我确定这是一个非常愚蠢的脑屁,但我就是想不出我搞砸了什么。
这段代码中出现的问题是对变量的赋值引起混淆。代码中的操作是通过+=运算符将一个列表与另一个列表连接起来,然后将结果赋值给chain变量。由于这个操作会使chain变量不断增长,当打印seq变量时,由于seq等于chain,因此得到的是最新的结果。
然而,问题在于对于初学者来说,这样的赋值方式可能不够清晰明确。代码中并没有对chain变量进行初始化或者明确说明其是一个列表,因此在初次阅读时可能会对chain变量的类型和赋值方式感到困惑。
为了解决这个问题,可以在代码中添加注释来解释变量的类型和赋值方式。同时,还可以在代码中使用更加明确的变量名,以便更容易理解代码的逻辑。例如,可以将chain变量改为result或者concatenated_lists,以更清晰地表达其含义。
对于初学者来说,代码中的变量赋值方式应该尽可能清晰明确,避免引起混淆和困惑。通过添加注释、使用明确的变量名和提供更详细的解释,可以帮助初学者更好地理解代码的逻辑和含义。
问题的原因是代码中的变量赋值部分导致了混淆。在这段代码中,seq = chain
将chain
列表创建了另一个引用。然后你打印了这个列表,但是循环没有停止。你继续扩展chain
,由于seq
只是对这个列表的引用,所以当循环结束后你会看到这些变化。在剩余的for
循环迭代中,chain
/ seq
继续改变,但是if
条件不再满足,所以你不会看到这些变化。
在这里你继续扩展了chain
:
chain += [primes[secnum]]
这使用了增强赋值;它不会创建一个新的列表,而是扩展了现有的列表。它等同于chain.extend(primes[secnum])
。
你可以通过创建chain
的一个副本来修复这个问题,并将其存储在seq
中:
seq = chain[:]