简体   繁体   English

在python中返回了错误的列表

[英]Wrong list being returned in python

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)

I am having a problem with the above code. 我上面的代码有问题。 Everything seems fine till the for loop ends, but after that instead of printing the maxPart value at the line print 'before ret max part' , it prints the last value of tempPartition (both represent a list of numbers). 一切似乎罚款,直到for循环结束,但在此之后,而不是打印的maxPart在该行值print 'before ret max part' ,它打印的最后一个值tempPartition (两者都代表号码的列表)。 The print statements confirm that the if condition is not satisfied every time, especially the last few runs in the loop. 打印语句确认每次都不满足if条件,尤其是循环中的最后几个运行。 So I don't see how the value of tempPartition is being transferred to maxPart . 所以我看不到tempPartition的值如何转移到maxPart Please help me with this. 请帮我解决一下这个。 It is driving me crazy. 这让我发疯。 I am sure I am missing something simple. 我确信我缺少一些简单的东西。 Thanks! 谢谢!

EDIT: 编辑:

Adding code for runKL 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

When you say 当你说

maxPart = tempPartition

you are not creating a copy of tempPartition but you are making the maxPart also to point to the same list that tempPartition points to. 没有创建的副本tempPartition ,但你可以将这个maxPart也指向同一列表tempPartition指向。 To really make a copy, you can use slicing notation like this 要真正制作副本,您可以使用像这样的切片符号

maxPart[:] = tempPartition

or 要么

maxPart = tempPartition[:]

The difference between maxPart[:] = tempPartition and maxPart = tempPartition[:] is that the former mutates the maxPart and copies all the values from tempPartition to maxPart and latter creates a new list with a copy of all the data in tempPartition and makes the maxPart points to the newly created list. maxPart[:] = tempPartitionmaxPart = tempPartition[:]之间的区别在于,前者会改变maxPart并将所有值从tempPartitionmaxPart ,后者会创建一个新列表,其中包含tempPartition中所有数据的tempPartition ,并使maxPart指向新创建的列表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM