一个不涉及重要代码的forloop如何改变程序输出?

2024-10-02 00:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个相对较大的python文件,并且正在添加下一个重要特性。但是,我注意到插入任何for循环都会改变程序的输出。你知道吗

为了测试这一点,我加入了以下循环:

for fff in range(2):
    print 'test'

变量fff不会出现在代码的其他地方。输出通过一个名为trueRepeats的列表进行迭代,这显然不是此代码所涉及的(也不是任何变量)。然而,不管我把这个循环放在代码的什么地方——甚至在声明trueRepeats之前;即使是导入之后执行的第一个代码,输出也会改变。你知道吗

编辑:这里是完整的源代码:BitBucket。我试图添加循环的原始位置在注释块4下,但正如前面提到的,它似乎在其他许多地方引起了问题。我在查档案”示例.py“也在存储库中。如果没有循环,程序将返回两个重复,分别在第{4,7}行和第{1,10}行。对于循环,它返回{2,3}和{1,10}处的实例。你知道吗

我知道代码不多,但在我能够诊断问题是什么之前,我甚至不知道这是怎么可能的,这是我的问题:在python中是什么使得独立的for循环能够影响只涉及循环不涉及的变量的输出?你知道吗

编辑2:当我谈论输出更改时,我不是在谈论循环打印出的两个“测试”行。这些可以被pass代替,但我觉得print的副作用会更少。你知道吗

编辑3:进一步调查后,这个问题比for循环要深入得多,因此这个问题可能不太适合StackOverflow,因为真正的问题似乎没有那么集中。注释行:

if flag == 5:
    print "TEST: " + str(key)

也改变了程序输出,就像注释掉一行的一部分一样,它只是将文字+ "Parent: "附加到正在打印的字符串的末尾。像向字符串添加文字这样的副作用似乎并不正常,因此我需要进一步研究,以找出python行为如此奇怪的原因。你知道吗


Tags: 文件字符串代码in程序编辑forfff
2条回答

我想这就是你代码中的错误:

alphaset = set() ## 1
...
for i in range(len(partition)):
    for j in range(len(partition[i])):
        alphaset.add(type(partition[i][j])) ## 2
        nodecount += 1
...
count = 0
mapping = dict()
for elem in alphaset: ## 3
    mapping[elem] = count ## 4
    count+=1

alphasize = count
...
for i in range(len(partition)):
    j = len(partition) - i - 1
    ...
    for v in range(len(partition[j])):
        node = partition[j][v]

        SV = list()
        SV.append(mapping[type(node)]) ## 5

事情是这样的。在1处,您有一个集合,在2处填充了从具有特定“顺序”的列表中获取的某些类型。然后,在3和4处,您对集合进行迭代,并将set中的每个元素映射到某个数字。然后,在5,这个数字被添加到一个列表中。如果我正确理解了您的代码,那么代码的其余部分取决于列表中元素的“顺序”,这取决于映射,映射本身取决于集合中元素的顺序为1。你知道吗

现在,既不能保证set中元素的顺序,也不能保证迭代顺序。因此,在3和4,对于不同的运行,您将得到不同的映射。你知道吗

解决方案是将set显式排序为list,或者使用保留插入顺序的OrderedSet(假设点1之前的代码总是以相同的顺序插入节点)。你知道吗

不管剩下的代码是什么,这个循环都会输出两次“test”。 为什么?因为for循环不需要变量,“fff”只是一个用于迭代的占位符。 我可以有这个代码:

def add(a, b):
    print a + b
add(5, 5)
for fff in range(2):
    print "test"

结果是:

10testtest

相关问题 更多 >

    热门问题