Неверный список, возвращаемый в 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) 

У меня возникла проблема с вышеуказанным кодом. Все кажется прекрасным до окончания цикла for , но после этого вместо того, чтобы печатать значение maxPart в строке print 'before ret max part' , оно печатает последнее значение tempPartition (оба представляют собой список чисел). Операторы печати подтверждают, что условие 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 ie 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 

  • Как сохранить результат функции в переменной в Python?
  • Удалить список из списка в Python
  • Python - невозможно установить запросы : операция не разрешена
  • Удаление идентификатора набора при печати наборов в Python
  • Как работает функция min / max в вложенном списке?
  • Объединить элементы списков, если какое-то условие
  • Как выполнить цикл for в пакетах?
  • Как перечислить все поля класса в Python (и без методов)?
  • One Solution collect form web for “Неверный список, возвращаемый в python”

    Когда ты говоришь

     maxPart = tempPartition 

    вы не создаете копию tempPartition но вы делаете maxPart также указанием на тот же список, на который указывает tempPartition . Чтобы действительно сделать копию, вы можете использовать нотацию нарезки, подобную этой

     maxPart[:] = tempPartition 

    или

     maxPart = tempPartition[:] 

    Разница между maxPart[:] = tempPartition и maxPart = tempPartition[:] заключается в том, что первый мутирует maxPart и копирует все значения из tempPartition в maxPart а последний создает новый список с копией всех данных в tempPartition и делает maxPart указывает на вновь созданный список.

    Python - лучший язык программирования в мире.