有人能解释一下刚才发生了什么吗?(Python)

我在处理我的AI寻路(你不需要理解),不知为何,当我在shell中执行以下操作时,我的On[3]列表发生了扩展:

tempList.append([On[1]-1])(在程序出错之后。)为什么?

程序没有崩溃,但这不是我的问题。截图(忽略额外的打印输出,我正在尝试缩小导致问题的代码范围。)问题...

On[1] 是我的Y坐标。

相关代码位于#查找路径(在底部部分下)。我的代码(超过200行长。:/)

# 设置Python ----------------------------------------------- #import pygame, sys, random, time, webbrowser, osfrom datetime import datetime# 版本 ---------------------------------------------------- #Version = '1.0'# 设置pygame/窗口 ---------------------------------------- #x = 100y = 100import osos.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (x,y)mainClock = pygame.time.Clock()from pygame.locals import *pygame.init()pygame.display.set_caption('Pathfinding '+(Version)+'')WINDOWWIDTH = 200WINDOWHEIGHT = 200screen = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT),pygame.NOFRAME)# 字体 ------------------------------------------------------- #basicFont = pygame.font.SysFont(None, 20)# 图像 ----------------------------------------------------- ## 音频 ------------------------------------------------------ ## 颜色 ----------------------------------------------------- #WHITE = (255,255,255)BLACK = (0,0,0)GRAY3 = (105,105,105)GRAY = (195,195,195)GRAY2 = (127,127,127)RED = (255,0,0)GREEN = (0,255,0)BLUE = (0,0,255)GOLD = (255,215,0)PURPLE = (115,0,242)# 变量 -------------------------------------------------- #Map = ['0000000000',       '0300000000',       '0000000000',       '0200000000',       '0000000000',       '0000000000',       '0000000000',       '0000000000',       '0000000000',       '0000000000']Column = 0Row = 0Nodes = {}for whatevs in Map:    for whatevs2 in Map[Row]:        Nodes[''+(str(Column))+','+(str(Row))+''] = [Column,Row,int(whatevs2)]        if whatevs2 == '3':            On = [Column,Row,[[Column,Row]]]        Column += 1        if Column == 10:            Column = 0            Row += 1Open = {}Closed = {}# 矩形 ------------------------------------------------------ ## 定义 ------------------------------------------------ #def Distance(Location,End):    if Location != []:        if int(Location[0]) < End[0]:            Dist = End[0] - int(Location[0])        else:            Dist = int(Location[0]) - End[0]        if int(Location[1]) < End[1]:            Dist2 = End[1] - int(Location[1])        else:            Dist2 = int(Location[1]) - End[1]        Dist += Dist2        if Location[2] == 1:            return 100000        elif Location[2] == 2:            return 0        else:            return Dist    else:        return 100000# FPS -------------------------------------------------------- #FPS = 80TrueFPSCount = 0TrueFPS = 0fpsOn = FalsePrevNow = 0# 文本 -------------------------------------------------------- #def drawText(text, font, color, surface, x, y):    textobj = font.render(text, 1, color)    textrect = textobj.get_rect()    textrect.topleft = (x, y)    screen.blit(textobj, textrect)# 循环 ------------------------------------------------------- #while True:    # 黑屏 ------------------------------------------- #    screen.fill(BLACK)    # 显示节点 --------------------------------------------- #    for Node in Nodes:        Rect = pygame.Rect(Nodes[Node][0]*20,Nodes[Node][1]*20,20,20)        if Nodes[Node][2] == 0:            pygame.draw.rect(screen,WHITE,Rect)        elif Nodes[Node][2] == 1:            pygame.draw.rect(screen,BLUE,Rect)        elif Nodes[Node][2] == 2:            pygame.draw.rect(screen,GREEN,Rect)            End = [Nodes[Node][0],Nodes[Node][1]]        else:            pygame.draw.rect(screen,RED,Rect)    for Node in Closed:        Rect = pygame.Rect(Closed[Node][0]*20,Closed[Node][1]*20,20,20)        pygame.draw.rect(screen,(0,100,200),Rect)    Rect2 = pygame.Rect(On[0]*20,On[1]*20,20,20)    pygame.draw.rect(screen,(0,200,100),Rect2)    if [On[0],On[1]] == End:        print('完成。')        print(On[2])        input()        time.sleep(3)        pygame.quit()        sys.exit()    # 查找路径 ---------------------------------------------- #    Top = []    Bottom = []    Right = []    Left = []    Closed[''+(str(On[0]))+','+(str(On[1]))+''] = [On[0],On[1]]    try:        Top.append(Nodes[''+(str(On[0]))+','+(str(On[1]-1))+''][0])        Top.append(Nodes[''+(str(On[0]))+','+(str(On[1]-1))+''][1])        Top.append(Nodes[''+(str(On[0]))+','+(str(On[1]-1))+''][2])        tempList = []        tempList = On[2]        print(On)        tempList.append([On[0],On[1]-1])        print(On)        Top.append(tempList)        for item in Closed:            if Top != []:                if item == ''+(str(Top[0]))+','+(str(Top[1]))+'':                    Top = []    except NameError:        pass    except KeyError:        pass    try:        Bottom.append(Nodes[''+(str(On[0]))+','+(str(On[1]+1))+''][0])        Bottom.append(Nodes[''+(str(On[0]))+','+(str(On[1]+1))+''][1])        Bottom.append(Nodes[''+(str(On[0]))+','+(str(On[1]+1))+''][2])        tempList = []        tempList = On[2]        print('?')        print(On)        tempList.append([On[0],On[1]+1])        print(On)        print()        Bottom.append(tempList)        print('On')        print(On)        for item in Closed:            if Bottom != []:                if item == ''+(str(Bottom[0]))+','+(str(Bottom[1]))+'':                    Bottom = []    except NameError:        pass    except KeyError:        pass    try:        Right.append(Nodes[''+(str(On[0]+1))+','+(str(On[1]))+''][0])        Right.append(Nodes[''+(str(On[0]+1))+','+(str(On[1]))+''][1])        Right.append(Nodes[''+(str(On[0]+1))+','+(str(On[1]))+''][2])        tempList = []        tempList = On[2]        tempList.append([On[0]+1,On[1]])        Right.append(tempList)        for item in Closed:            if Right != []:                if item == ''+(str(Right[0]))+','+(str(Right[1]))+'':                    Right = []    except NameError:        pass    except KeyError:        pass    try:        Left.append(Nodes[''+(str(On[0]-1))+','+(str(On[1]))+''][0])        Left.append(Nodes[''+(str(On[0]-1))+','+(str(On[1]))+''][1])        Left.append(Nodes[''+(str(On[0]-1))+','+(str(On[1]))+''][2])        tempList = []        tempList = On[2]        tempList.append([On[0]-1,On[1]])        Left.append(tempList)        for item in Closed:            if Left != []:                if item == ''+(str(Left[0]))+','+(str(Left[1]))+'':                    Left = []    except NameError:        pass    except KeyError:        pass    if Top != []:        Open[''+(str(Top[0]))+','+(str(Top[1]))+''] = [Distance(Top,End),Top[0],Top[1],Top[3]]    if Bottom != []:        print(':D')        print(On)        Open[''+(str(Bottom[0]))+','+(str(Bottom[1]))+''] = [Distance(Bottom,End),Bottom[0],Bottom[1],Bottom[3]]    if Right != []:        Open[''+(str(Right[0]))+','+(str(Right[1]))+''] = [Distance(Right,End),Right[0],Right[1],Right[3]]    if Left != []:        Open[''+(str(Left[0]))+','+(str(Left[1]))+''] = [Distance(Left,End),Left[0],Left[1],Left[3]]    Lowest = [0,0]    LowestNum = 100000    try:        del Open[''+(str(On[0]))+','+(str(On[1]))+'']    except KeyError:        pass    for Place in Open:        if Open[Place][0] < LowestNum:            LowestNum = Open[Place][0]            Lowest = [Open[Place][1],Open[Place][2],Open[Place][3]]    On = Lowest    # FPS ---------------------------------------------------- #    NewSec = False    TrueFPSCount += 1    now = datetime.now()    now = now.second    if PrevNow != now:        PrevNow = now        NewSec = True        TrueFPS = TrueFPSCount        TrueFPSCount = 0        TrueFPS = str(TrueFPS)    # 按钮 ------------------------------------------------ #    for event in pygame.event.get():        if event.type == KEYDOWN:            if event.key == K_ESCAPE:                pygame.quit()                sys.exit()            if event.key == ord('x'):                if fpsOn == True:                    fpsOn = False                elif fpsOn == False:                    fpsOn = True    # 更新 ------------------------------------------------- #    if fpsOn == True:        drawText('FPS:'+(TrueFPS)+'', basicFont, WHITE, screen, 500,12)    pygame.display.update()    mainClock.tick(10)

我不使用类或精灵。:P谢谢你来看!


回答:

因为你的On[-1]tempList是同一个对象。这就是同一个对象的工作原理:

>>> x=[1,2,3]>>> y=x>>> y.append(10)>>> x[1, 2, 3, 10]>>> y[1, 2, 3, 10]>>> 

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注