在python中自动列出更改
下面的代码正在自动更改列表K的值,请帮助我了解原因在python中自动列出更改,python,python-3.x,list,Python,Python 3.x,List,下面的代码正在自动更改列表K的值,请帮助我了解原因 1 4 1 2 4 3 我给出了上述输入 输出是这样的 [1, 2, 3, 4] [1, 2, 3, 4] 1 [1, 2, 3, 4] 2 1 1 [1, 2, 3, 4] 2 2 2 [1, 2, 3, 4] 2 3 4 [1, 2, 3, 4] 2 4 3 [1, 2, 4, 3] [1, 2, 4, 3] 1 [1, 2, 4, 3] 2 1 1 [1, 2, 4, 3] 2 2 2 [1, 2, 4, 3] 2 4 4 [1, 2,
1
4
1 2 4 3
我给出了上述输入
输出是这样的
[1, 2, 3, 4]
[1, 2, 3, 4] 1
[1, 2, 3, 4] 2
1 1
[1, 2, 3, 4] 2
2 2
[1, 2, 3, 4] 2
3 4
[1, 2, 3, 4] 2
4 3
[1, 2, 4, 3]
[1, 2, 4, 3] 1
[1, 2, 4, 3] 2
1 1
[1, 2, 4, 3] 2
2 2
[1, 2, 4, 3] 2
4 4
[1, 2, 4, 4] 2
4 3
[1, 2, 4, 4]
[1, 2, 4, 4]
在最后的步骤中,列表k的值会自动更改
这是在PyPy3和Python3.7上完成的
t=int(input())
while t!=0:
t-=1
n=int(input())
h=[0]*n
lt=[0]*n
c=0
l=[int(i) for i in input().split()]
k=[i for i in range(1,n+1)]
print(k)
while c!=7:
print(k, end=" ")
print("1")
c+=1
for i in range(n):
print(k, end=" ")
print("2")
lt[l[i]-1]=k[i]
print(k[i],end =" ")
print(l[i])
k=lt
print(k)
for i in range(n):
if k[i]==l[i] and h[k[i]-1]==0:
h[k[i]-1]=c
print(*h,sep=" ")
为了实现所需的功能,您需要向k提供列表的新副本 Python中的一切都是对象。 当您执行
k=lt
时,实际上是将变量lt
中包含的引用提供给k
分配后,您可以通过打印(id(k)、id(lt))检查上述事实
有许多方法可以从现有列表创建新列表。对于大多数问题,您可以参考stackoverflow问题
对于上述问题,请将代码中的第19行(
k=lt
)替换为k=lt.copy()
或k=list(lt)
,请不要介意最终输出,因为列表k不正确k=lt
使k
引用与lt
相同的列表对象;它不会使k
引用lt
的当前值的副本。请尝试创建一个有问题的最小示例,这样我们就不必进行所有检查。请参见,但k值仅在循环结束后更新,这无关紧要;下次进入该循环时,lt
仍指向相同的列表;您没有为lt
创建要引用的新列表。谢谢,这确实有帮助