Skip to main content
 首页 » 编程设计

python之Python中的二维列表重复随机数赋值

2025年05月04日12findumars

抱歉,我确信这个问题以前出现过,但似乎没有一个例子适用。

我正在尝试创建一个二维列表(4 x 100),它在每一行的不同范围内分配随机值。

import random 
size_of_meadow = 100 
no_of_flowers = 100 
no_of_flower_types = 3 
 
flower = [[0] * 5] * no_of_flowers 
 
for row in range(no_of_flowers): 
    flower[row][0] = random.randint(0, size_of_meadow - 1)  # x coord 
    flower[row][1] = random.randint(0, size_of_meadow - 1)  # y coord 
    flower[row][2] = random.randint(1, no_of_flower_types) 
if random.randint(0, 100) < 5: 
    flower[row][3] = 1 
else: 
    flower[row][3] = 0 
 
print(flower[0][0]) 
print(flower[0][1]) 
print(flower[0][2]) 
print(flower[0][3]) 
print(" ") 
print(flower[1][0]) 
print(flower[1][1]) 
print(flower[1][2]) 
print(flower[1][3]) 
# Sorry the above isn't in a for loop 

输出只是为二维列表的每一行显示相同的一组数字...

输出:

29 
21 
2 
0 
 
29 
21 
2 
0 

我是 python 的新手,我知道我一定遗漏了一些基本的东西,但经过大量的思考和啊哈之后我还没有弄清楚,任何帮助都将不胜感激。

谢谢

请您参考如下方法:

通过使用 [[0] * 5] * no_of_flowers,您将创建 100 个对同一列表的引用。这意味着内存中只有ONLY ONE ROW。

当您修改一行时,如果影响内存中的行,并且由于所有其他“行”引用它,它们将简单地使用内存中的最新列表。

要避免这种情况,您可以使用:

flower = [[0 for _ in range(5)] for _ in range(no_of_flowers)] 

你可以找到一个 example and explanation in wtfpython :

# Let's initialize a row 
row = [""]*3 #row i['', '', ''] 
# Let's make a board 
board = [row]*3 

输出:

>>> board 
[['', '', ''], ['', '', ''], ['', '', '']] 
>>> board[0] 
['', '', ''] 
>>> board[0][0] 
'' 
>>> board[0][0] = "X" 
>>> board 
[['X', '', ''], ['X', '', ''], ['X', '', '']] 

解释:

当我们初始化 row 变量时,这个可视化解释了内存中发生的事情。

当 board 通过乘以 row 进行初始化时,这就是内存中发生的事情(每个元素 board[0],board[1] 和 board[2] 是对 row 引用的同一列表的引用)

我们可以通过不使用row 变量来生成board 来避免这种情况。 (在 this 问题中提出)。

>>> board = [['']*3 for _ in range(3)] 
>>> board[0][0] = "X" 
>>> board 
[['X', '', ''], ['', '', ''], ['', '', '']]