在python中返回错误的列表

时间:2013-11-16 14:25:45

标签: python list python-2.7

def mainCall(nodeGroup):

    maxScore = -9999999
    maxPart = []
    tempPartition = []
    tempScore = 0.0

    for j in range(2, 1+nodes/2):

        nodeGroup = chooseInitPartition(j, nodeGroup)
        tempScore, tempPartition = runKL(edgeList, nodeGroup, rounds)
        print 'temp score', tempScore
        print 'temp part', tempPartition, "\n"
        if(maxScore < tempScore):
            maxScore = tempScore
            maxPart = tempPartition
            print "max score", maxScore
            print "maxpart", maxPart, "\n"

     print 'before ret max part', maxPart
     return maxScore, maxPart

finalScore, finalPartition = mainCall(nodeGroup)

我遇到上述代码的问题。在for循环结束之前,一切似乎都很好,但在此之后,而不是在maxPart行打印print 'before ret max part'值,它会打印tempPartition的最后一个值(两者都代表一个数字列表)。 print语句确认每次都不满足if条件,尤其是循环中的最后几次运行。因此,我看不到tempPartition的值如何转移到maxPart。请帮我解决一下这个。这让我发疯了。我确信我错过了一些简单的事情。谢谢!

编辑:

添加runKL

的代码
def runKL(edgeList, nodeGroup, rounds):

    nodeSwap = [0]*nodes
    maxLogLScore = 0.0
    edgeListLen = len(edgeList)

    networkPartitionStore = []
    logLScores = []

    #Reset count
    count = 0

    #Start main loop
    for i in range(rounds):
        #mark all vertices as unswapped
        for j in range(len(nodeSwap)):
            nodeSwap[j] = 0


        while(count < 100):
            #Choose one edge uniformly randomly
            randNum = random.uniform(0,1)
            edge = edgeList[int(math.floor(edgeListLen*randNum))]
            node1 = int(edge[0]) - 1
            node2 = int(edge[1]) - 1

            if((nodeGroup[node1] == nodeGroup[node2]) or (nodeSwap[node1] == 1) or (nodeSwap[node2] == 1)):
                count += 1
                continue
            else:
                #swap groups among nodes
                temp = nodeGroup[node1]
                nodeGroup[node1] = nodeGroup[node2]
                nodeGroup[node2] = temp

                #mark vertices as swapped
                nodeSwap[node1] = 1
                nodeSwap[node2] = 1

                #calculate likelihood
                logLScore = logLikelihood(edgeList, nodeGroup)
                logLScores.append(logLScore)

                #store network
                networkPartitionStore.append(nodeGroup)

                #reset count value
                count = 0

        #end while loop

        #Choose the index of the maximum likelihood score
        maxLogLScore = max(logLScores)
        index = logLScores.index(maxLogLScore)
        #print 'max score', modularityScores[index]

        #Choose the corresponding network partition i.e. the way the groups have been assigned to the nodes
        nodeGroup = networkPartitionStore[index]

        #Reset partition storage list and modularity scores
        networkPartitionStore = []
        logLScores = []

        #Store initial network partition structure and modularity score. 
        networkPartitionStore.append(nodeGroup)
        logLScores.append(maxLogLScore)

    return maxLogLScore, nodeGroup

1 个答案:

答案 0 :(得分:5)

当你说

maxPart = tempPartition

您没有创建tempPartition的副本,但是您maxPart也指向tempPartition指向的相同列表。要真正制作副本,您可以使用像这样的切片符号

maxPart[:] = tempPartition

maxPart = tempPartition[:]

maxPart[:] = tempPartitionmaxPart = tempPartition[:]之间的区别在于前者会改变maxPart并将所有值从tempPartition复制到maxPart,后者会创建一个新的列出tempPartition中所有数据的副本,并将maxPart点指向新创建的列表。

相关问题