重写列表列表中的值

2024-05-23 17:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它列出了一个代表游乐场的列表:

#Script:
import math
listx=[]
List=[]
N_M=input("Enter N M: ").split()
n=int(N_M[0])
m=int(N_M[1])
for i in range(m):
    listx+=[0]
for i in range(n):
    List.append(listx)
print(List)

#Example of playground for M=3 and N=3:
[0,0,0] 
[0,0,0] 
[0,0,0]

然后我想把某个地方改成1

List[0][1]=1

这应该(如果我理解正确)将其更改为:

[0,1,0]
[0,0,0] 
[0,0,0]

但它将每个列表更改为:

[0,1,0]
[0,1,0] 
[0,1,0]

请帮忙! 非常感谢您的建议


Tags: inimport脚本列表forinputscriptrange
3条回答

在第二个for循环中,您多次追加相同的列表,您追加的是“视图/引用”,而不是实际的列表,因此在第二个for循环中,您必须追加listx的副本,为此,您可以使用:

  • list(listx)
  • listx[::]
  • listx.copy()

就像你想买苹果,但是你只有第一个苹果的一张和另外3张照片,你可以说你有4个苹果

在第二个for循环中,您将相同的列表添加到Listn次

for i in range(n):
    List.append(listx)

您需要复制listx&;使用List中的那些。像这样:

for i in range(n):
    List.append(listx[::])

listx[::]制作listx的副本以供使用

此位:

for i in range(n):
    List.append(listx)

将相同的列表(listx)添加到List三次。因此,当您将其更改为一个位置时,所有引用都会更改,因为它们都指向同一个列表

另外,作为旁注:不要用大写字母命名变量List,因为这会让其他人(和软件)认为它是一个类。而名称list当然更糟糕,因为这会掩盖类型list。提出有意义的名称,而不是像playground这样的泛型名称

创建nxm列表的更有效方法:

playground = [[0] * m for _ in range(n)]

[0] * m创建一个带有m个零的列表;这是因为数字不像列表那样被引用,零也不是同一变量的副本

for _ in range(n)导致生成的列表填充这些列表中的n_只是意味着你没有对来自range()的数字做任何事情,它只是在那里重复了很多次,for循环需要一些东西,或者是变量,或者是_“不在乎”

相关问题 更多 >