[英]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[:] = tempPartition
和maxPart = tempPartition[:]
之间的区别在于,前者会改变maxPart
并将所有值从tempPartition
到maxPart
,后者会创建一个新列表,其中包含tempPartition
中所有数据的tempPartition
,并使maxPart
指向新创建的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.