簡體   English   中英

當我不引用列表時,Python會覆蓋列表值

[英]Python overwriting my list values when I am not referencing the list

我一直在嘗試在Python中使用列表。 我只調用一次就可以在一個循環中存儲一個值。 然后,我在另一個循環中再次調用它,但是當我向列表中添加內容時,在我實際添加新條目之前,它已經用新條目覆蓋了我的舊條目。 可能是我沒有完全理解Python,但是我將在下面發布代碼的簡單版本,然后發布整個版本:

ret=[]
plan=argument
for i in range(x):
    plan.changeY
    ret.append(plan)
    plan=argument
for i in range(Z):
    plan.changeD
    ret.append(plan)
    plan=argument

在出現第二個附錄之前就出現了問題:第一個附錄的所有值都已更改。 它的代碼如下。

global PLANCOUNTER
global VARNUM
ret=[]
ret=[]
plan = node.state
keep = plan
if printPlans:
    print "fringe[0].state:",plan.id, "---"
    printstate(plan)
if node.parent:
    print "parent: plan",node.parent.state.id
if len(plan.openconds)>0:
    print plan.openconds[0],"is the condition being resolved\n"
    openStep = plan.openconds[0][1]#access the step
    openStep1=openStep
    openCond = plan.openconds[0][0]
    plan.openconds = plan.openconds[1:]
    keep=plan
    if(len(plan.steps)>1):#has init and goal!
    ########################
    #NOT GETTING RID OF THE OPENCOND, SO ASTAR NEVER TAKING IT
    #######################
        if openStep!="init" and openStep!="goal":
            val = openStep.index("*")
            openStep=openStep[:val]
        numPreConds=len(preconds[openStep])
        numStep=len(plan.steps)
        for i in plan.steps:
            i2=i
            plan = keep
            if i!="init" and i!="goal":
                i=i[:i.index("*")]
            if  i !="goal" and i!=openStep:
                for j in adds[i]:
                    bool=0
                    if j==openCond:
                        plan.causallinks.append((i2,openCond,openStep1))#problem
                        plan.ordercons.append((i2,openStep1))
                        PLANCOUNTER+=1
                        plan.id=PLANCOUNTER
                        #threats
                        bol=0
                        for t in plan.steps:#all steps
                            t2=t
                            if t!="init" and t!="goal":
                                val = t.index("*")
                                t=t[:val]
                            for k in deletes[t]:
                                if k == openCond:
                                    for b in plan.ordercons:
                                        if b ==(t,i):
                                            bol=1
                                if bol==0 and t!=i:
                                    for v in plan.threats:
                                        if v[0]==(i2,openCond,openStep1) and v[1]==t2:
                                            bol=1
                                if bol==0 and t!=i and i2!="init":
                                    plan.threats.append(((i2,openCond,openStep1),t2))
                                else:
                                    bol=0
                        ret.append(plan)
                        print len(plan.openconds)+len(plan.threats)," upper\n"
                        plan=keep
    meh=ret
    counter=0
    arr={}
    for k in ret:
        print len(k.openconds)+len(k.threats)," ", k.id,"middle"
        key = counter
        arr[counter]=k
        print arr[counter].id
        counter+=1
    for i in adds:#too many conditions
        stepCons = i
        plan2 = keep
        if i!="goal" and i!="init" and i!=openStep:
            for j in adds[i]:
                if j==openCond:
                    nextStep=i
                    st = str(i)+"*"+str(VARNUM)
                    VARNUM+=1
                    plan2.steps.append(st)
                    plan2.ordercons.append(("init",st))
                    plan2.ordercons.append((st, "goal"))
                    plan2.ordercons.append((st,openStep1))
                    plan2.causallinks.append((st,openCond,openStep1))
                    ##################################################
                    for k in preconds[i]:#issue is htereeeeeeeee
                        plan2.openconds.append((k,st))
                    for k in meh:
                        print len(k.openconds)+len(k.threats)," ", k.id,"middle2s"
                    PLANCOUNTER+=1
                    plan2.id=PLANCOUNTER
                    #threats
                    cnt=0
                    for tr in range(len(arr)):
                        print len(arr[cnt].openconds)+len(arr[cnt].threats)," ", arr[cnt].id,"middlearr"
                        cnt+=1
                    bol=0
                    for t in plan2.steps:#all steps
                        t2=t
                        if t!="init" and t!="goal":
                            val = t.index("*")
                            t=t[:val]
                        for k in deletes[t]:#check their delete list
                            if k == openCond:#if our condition is on our delete lise
                                for b in plan2.ordercons:
                                    if b ==(t,i):# and it is not ordered before it
                                        bol=1
                            if bol==0 and t!=i:
                                for v in plan2.threats:
                                    if v[0]==(i2,openCond,openStep1) and v[1]==t2:
                                        bol=1
                            if bol==0 and t!=i and st!="init":
                                plan2.threats.append(((st,openCond,openStep1),t2))
                            else:
                                bol=0
                            #and y is not before C
                            #causal link, threatening step
                    for k in ret:
                        print len(k.openconds)+len(k.threats)," ", k.id,"middle3"
                    ret.append(plan2)
                    print len(plan2.openconds)+len(plan2.threats)," ",plan2.id," lower\n"
elif len(plan.threats)>0:
    #keep=plan
    openThreatProducer = plan.threats[0][0][0]#access the step
    openThreat=plan.threats[0][1]
    plan.threats=plan.threats[1:]
    print openThreatProducer, " ", openThreat
    i=0
    while i<2:
        plan = keep
        if i==0:
            bool=0
            for k in plan.ordercons:
                if (k[0]==openThreat and k[1]==openThreatProducer) or (k[1]==openThreat and k[0]==openThreatProducer):
                    bool=1
            if bool==0:
                plan.ordercons.append((openThreatProducer,openThreat))
        elif i==1:
            bool=0
            for k in plan.ordercons:
                if (k[0]==openThreat and k[1]==openThreatProducer) or (k[1]==openThreat and k[0]==openThreatProducer):
                    bool=1
            if bool==0:
                plan.ordercons.append((openThreat,openThreatProducer))
        ret.append(plan)
        i+=1
t=len(ret)
for k in ret:
    print len(k.openconds)+len(k.threats)," ", k.id,"lowest"
print t
return ret

看起來在執行plan=argumentplanargument指向相同的位置。 你應該做這樣的事情

import copy  
plan = copy.deepcopy(argument)

這將創建參數的精確副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM