我遇到了问题。在python中我有一个函数,它应该打印最长的路径。如果我使用[[1,2,3,4,5][1,2,3,4,5]]
之类的列表,但是如果我使用像[x] for x in range(5)]*2
这样的列表,或者像这样的任何其他列表,则该函数有效。 (我不知道在python中调用了什么,但是如果我有像[vale] *那样的列表),则代码不起作用。
所以,我的问题是,如何在没有任何参考的情况下制作新的清单。 Deepcopy或[:]不起作用,因为列表中的引用仍然存在。但我不知道如何在没有引用的情况下复制值。 :) 谢谢。
def naj_narascajoca(vrtek):
visina = len(vrtek)
sirina = len(vrtek[0])
vrt = []
vrt.append([-1]*(sirina+2))
for greda in vrtek:
greda.insert(0,-1)
greda.append(-1)
vrt.append(greda)
vrt.append([-1]*(sirina+2))
for i in vrt:
print(i)
pot = ""
maximal = 0
je_vecja = True
x = 1
y = 1
max_odlocitev = 0
while je_vecja == True:
print("--------------",vrt[x][y],"-----------------")
vre_left = vrt[x][y-1]
vre_right = vrt[x][y+1]
vre_up = vrt[x-1][y]
vre_down = vrt[x+1][y]
sez = sorted([vre_down,vre_left, vre_right, vre_up])
for i in sez:
if i > maximal:
max_odlocitev = i;
break
#max_odlocitev = max(vrt[x][y-1],vrt[x][y+1], vrt[x+1][y], vrt[x-1][y])
if maximal < max_odlocitev:
maximal = max_odlocitev
if vrt[x][y-1] == maximal:
pot += "L"
y -=1
elif vrt[x][y+1] == maximal:
pot += "R"
y+=1
elif vrt[x+1][y] == maximal:
pot += "D"
x+=1
elif vrt[x-1][y] == maximal:
pot += "U"
x-=1
else:
je_vecja = False
print(pot)
vrt = [[1,3,3,8,5,4,2,1,5,6],
[2,4,3,3,6,8,1,3,5,6],
[4,5,6,4,7,4,3,6,4,7],
[2,8,7,0,0,7,4,7,8,0],
[2,3,4,7,0,8,7,6,3,8],
[3,7,9,0,8,5,3,2,3,4],
[1,5,7,7,6,4,2,3,5,6],
[0,6,3,3,6,8,0,6,7,7],
[0,1,3,2,8,0,0,0,0,0],
[3,1,0,3,6,7,0,5,3,1],
[1,3,5,7,0,8,6,5,3,1],
[3,6,3,1,3,5,8,7,5,1],
[4,3,6,0,0,8,4,7,5,3],
[3,5,6,8,6,3,1,3,5,2]]
#naj_narascajoca(vrt)
naj_narascajoca([[x] for x in range(5)]*2)
答案 0 :(得分:1)
像这样:
[any mutable objects] * 2
...显式地对每个可变对象进行两次引用。使用the FAQ中解释的相同解决方案,创建原始列表并不重要,它是同一个问题:您必须两次定义列表。所以,而不是:
[[x] for x in range(5)]*2
......这样做:
[[x] for _ in range(2) for x in range(5)]
deepcopy
似乎不起作用的原因是你(大概)使用它是这样的:
copy.deepcopy([[x] for x in range(5)]*2)
deepcopy
比你想象的要聪明。它将2个引用结构的深层副本复制到5个列表的相同列表中。因此,您最终得到5个新列表,5个列表的新列表,以及2个新列表的新引用。
但可以做你想做的事。您只需要在将两个副本放在一起之前复制列表:
>>> a = [[x] for x in range(5)]
>>> b = [copy.deepcopy(a), copy.deepcopy(a)]
>>> # or [copy.deepcopy(a) for _ in range(2)]
>>> b[0] is b[1]
False
>>> b[0][0] is b[1][0]
False
或者,映射两个引用列表上的副本,因此它们各自被单独复制:
>>> b = [copy.deepcopy(x) for x in a*2]
>>> b[0][0] is b[1][0]
False
答案 1 :(得分:0)
当您在列表中使用*2
时,您没有像您发现的那样复制列表 - 您正在对完全相同的列表进行两次引用。您可以使用其他级别的列表理解来获得所需的内容。
[[[x] for x in range(5)] for y in range(2)]
或许问题是当你想要一个列表1-5时,你在内部部分得到一个列表列表:
[list(range(1, 6)) for x in range(2)]