Python 我能';t将单个元素附加到嵌套列表

Python 我能';t将单个元素附加到嵌套列表,python,list,nested,Python,List,Nested,我正在尝试向嵌套列表中的列表添加元素。但是,元素会添加到嵌套列表中的每个列表中,而不仅仅是它要进入的列表。我尝试过使用同一段代码,它在我的程序之外工作得非常好,所以我将在这里添加我的整个程序。我为自己的糟糕形式和效率低下道歉,但我对编码还是比较陌生的。谢谢 import pygame import sys from random import randint import math pygame.init() black = 0,0,0 white = 255,255,255 red = 255

我正在尝试向嵌套列表中的列表添加元素。但是,元素会添加到嵌套列表中的每个列表中,而不仅仅是它要进入的列表。我尝试过使用同一段代码,它在我的程序之外工作得非常好,所以我将在这里添加我的整个程序。我为自己的糟糕形式和效率低下道歉,但我对编码还是比较陌生的。谢谢

import pygame
import sys
from random import randint
import math
pygame.init()
black = 0,0,0
white = 255,255,255
red = 255,0,0
blue = 0,0,255
screen = pygame.display.set_mode((500,500))
screen.fill(white)

citiesX = []
citiesY = []
visits = []
paths = []
lengths = []
cities = []
list1 = []

#Sets the colour of the line depending on its length
def getColour(CurrentLength):
    percentage = (CurrentLength/1400)*100
    colour = 2.55*percentage
    return(colour)

#Renders Lines
def drawLines(visits):
    global citiesX
    global citiesY
    screen.fill(white)
    pygame.draw.circle(screen, red, (citiesX[0],citiesY[0]), 5, 4)
    #Draw Cities
    for i in range (1,len(citiesX)):
        pygame.draw.circle(screen, black, (citiesX[i],citiesY[i]), 5, 4)
    #Draw Paths
    for i in range (0,len(visits)-1):
        #Colour Rendering
        lengthX = (citiesX[visits[i]]-citiesX[visits[i+1]])*(citiesX[visits[i]]-citiesX[visits[i+1]])
        lengthY = (citiesY[visits[i]]-citiesY[visits[i+1]])*(citiesY[visits[i]]-citiesY[visits[i+1]])
        CurrentLength = math.sqrt(lengthX+lengthY)
        #Draw Lines
        pygame.draw.lines(screen, (getColour(CurrentLength),getColour(CurrentLength),getColour(CurrentLength)), False, [(citiesX[visits[i]],citiesY[visits[i]]),(citiesX[visits[i+1]],citiesY[visits[i+1]])], 4)
        pygame.display.update() 



#Find out how long a generated path is
def getPathLength(visits):
    totalLength = 0
    for i in range (0,len(visits)-1):
        lengthX = (citiesX[visits[i]]-citiesX[visits[i+1]])*(citiesX[visits[i]]-citiesX[visits[i+1]])
        lengthY = (citiesY[visits[i]]-citiesY[visits[i+1]])*(citiesY[visits[i]]-citiesY[visits[i+1]])
        CurrentLength = math.sqrt(lengthX+lengthY)
        pygame.draw.lines(screen, (getColour(CurrentLength),getColour(CurrentLength),getColour(CurrentLength)), False, [(citiesX[visits[i]],citiesY[visits[i]]),(citiesX[visits[i+1]],citiesY[visits[i+1]])], 4)
        pygame.display.update()
        totalLength +=CurrentLength
    return(totalLength)

#Evolve the paths
def evolve(gen):
    global paths
    global lengths
    global citiesX
    global visits
    global cities
    global list1
    for i in range (0,100):
        visits = []
        visits.append(0)
        #for i in range (1,count):
        #   visits.append(gen[i])
        x = 0
        while len(visits)<len(citiesX):
            num = list1[x][randint(0,len(citiesX)-1)]
            while (num in visits):
                num = list1[x][randint(0,len(citiesX)-1)]
            visits.append(num)
            x = x+1

        paths.append(visits)
        lengths.append(getPathLength(visits))

    genPicker = sorted(lengths)
    gen = paths[lengths.index(genPicker[0])]
    bad = paths[lengths.index(genPicker[99])]
    print(gen)
    drawLines(gen)
    gen.remove(0)
    bad.remove(0)
#THIS IS WHERE THE ISSUE IS!!!!!!!
    for i in gen:
       list1[gen.index(i)].append(i)
    print(list1)
    paths = []
    lengths = []
    #count = count+1
    evolve(gen)

#Randomly Generates the cities
for i in range (0,10):
    citiesX.append(randint(0,500))
    citiesY.append(randint(0,500))

#lists used for evolution
for x in range(0,len(citiesX)):
    cities.append(x)
print("Cities: ",cities)
for i in range(0,len(cities)-1):
    list1.append(cities)
print(list1)

#Draws the cities
pygame.draw.circle(screen, red, (citiesX[0],citiesY[0]), 5, 4)
for i in range (1,len(citiesX)):
    pygame.draw.circle(screen, black, (citiesX[i],citiesY[i]), 5, 4)

#Creates First Generation
for i in range (0,100):
    visits.clear()
    visits.append(0)

    while len(visits)<len(citiesX):
        num = cities[randint(0,len(citiesX)-1)]
        while num in visits:
            num = cities[randint(0,len(citiesX)-1)]
        visits.append(num)

    paths.append(visits)
    lengths.append(getPathLength(visits))

#Gets the best path from the first generation
genPicker = sorted(lengths)
#Stores Gen1
gen1 = paths[lengths.index(genPicker[0])]
print(gen1)
#Draws Gens1
drawLines(gen1)
#resets varaibles
paths = []
lengths = []
count = 1

#The program evolves the path
evolve(gen1)
导入pygame
导入系统
从随机导入randint
输入数学
pygame.init()
黑色=0,0,0
白色=255255
红色=255,0,0
蓝色=0,0255
screen=pygame.display.set_模式((500500))
屏幕填充(白色)
Citiex=[]
citiesY=[]
访问量=[]
路径=[]
长度=[]
城市=[]
列表1=[]
#根据线条的长度设置线条的颜色
def GetColor(当前长度):
百分比=(当前长度/1400)*100
颜色=2.55*百分比
退货(彩色)
#渲染线条
def抽绳(检查):
全球花旗
全球城市
屏幕填充(白色)
pygame.draw.circle(屏幕,红色,(citiesX[0],citiesY[0]),5,4)
#画城市
对于范围(1,len(citiesX))中的i:
pygame.draw.circle(屏幕,黑色,(citiesX[i],citiesY[i]),5,4)
#画路径
对于范围内的i(0,len(访问)-1):
#显色
长度=(citiesX[访问[i]]-citiesX[访问[i+1]])*(citiesX[访问[i]]-citiesX[访问[i+1]])
冗长=(citiesY[访问[i]]-citiesY[访问[i+1]])*(citiesY[访问[i]]-citiesY[访问[i+1]])
CurrentLength=math.sqrt(长度x+Length)
#划线
pygame.draw.lines(屏幕,(GetColor(CurrentLength)、GetColor(CurrentLength)、GetColor(CurrentLength))、False、[(citiesX[访问[i]]、citiesY[访问[i]]、(citiesX[访问[i+1]]、citiesY[访问[i+1]])、4)
pygame.display.update()
#了解生成的路径有多长
def getPathLength(访问次数):
总长度=0
对于范围内的i(0,len(访问)-1):
长度=(citiesX[访问[i]]-citiesX[访问[i+1]])*(citiesX[访问[i]]-citiesX[访问[i+1]])
冗长=(citiesY[访问[i]]-citiesY[访问[i+1]])*(citiesY[访问[i]]-citiesY[访问[i+1]])
CurrentLength=math.sqrt(长度x+Length)
pygame.draw.lines(屏幕,(GetColor(CurrentLength)、GetColor(CurrentLength)、GetColor(CurrentLength))、False、[(citiesX[访问[i]]、citiesY[访问[i]]、(citiesX[访问[i+1]]、citiesY[访问[i+1]])、4)
pygame.display.update()
总长度+=当前长度
返回(总长度)
#发展道路
def(发电机):
全局路径
全局长度
全球花旗
全球访问
全球城市
全球清单1
对于范围(0100)内的i:
访问量=[]
访问。附加(0)
#对于范围内的i(1,计数):
#访问。附加(gen[i])
x=0
而len(访问)
问题在于如何创建
list1
。列表1仅包含相同对象20次左右

创建时:

for i in range(0,len(cities)-1):
    list1.append(cities)
您只是将相同的列表放入
list1
。另一方面,这会附加一个克隆:

for i in range(0,len(cities)-1):
    list1.append(cities[:]) # note the :. 
问题在于如何创建
list1
。列表1仅包含相同对象20次左右

创建时:

for i in range(0,len(cities)-1):
    list1.append(cities)
您只是将相同的列表放入
list1
。另一方面,这会附加一个克隆:

for i in range(0,len(cities)-1):
    list1.append(cities[:]) # note the :. 

这是很多代码!你能把它缩短到一个吗?也许把这个部分去掉,然后再包含完整的代码?你能把你的代码简化并添加更多的解释吗?代码太多了!你能把它缩短到一个吗?也许把这个部分去掉,然后把完整的代码放在后面?你能把你的代码减到最少,再加上更多的解释吗?