Python中的2D list重复随机数指定

2024-06-06 21:15:19 发布

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

很抱歉,因为我确信这个问题以前就出现过,但这些例子似乎都不适用。在

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

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

输出只是显示2D列表中每一行的相同的一组数字。。。在

输出:

^{pr2}$

我是python新手,我知道我一定遗漏了一些基本的东西,但是在经过了大量的思考和思考之后,我还没有弄明白,任何帮助都是非常感谢的。在

谢谢


Tags: ofnoin列表forsizerandomrow
3条回答

你有一个列表包含100倍的相同列表

a=[0,0,0]
flower=[a,a,a,a,...]

更好的解决方案是

^{pr2}$

不过,造花机会更好

嘿@李说得对,但让我详细说明一下

>>> flower = [[0] * 5] * 100
>>> flower[0]
[0, 0, 0, 0, 0]
>>> flower[1]
[0, 0, 0, 0, 0]
>>> id(flower[0])
4354853640
>>> id(flower[1])
4354853640

在这里您可以看到每个子列表都指向内存中的相同位置

我会用这个方法:

^{pr2}$

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

当您修改一行时,如果影响内存中的行,并且因为所有其他“行”都引用它,那么它们只会使用内存中最新的列表。在

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

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

您可以找到一个example and explanation in wtfpython

^{pr2}$

输出:

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

说明:

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

enter image description here

board通过乘以row来初始化,这就是内存中发生的情况(元素board[0]board[1]和{}中的每个元素都是对row所引用的相同列表的引用)

enter image description here

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

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

相关问题 更多 >