抱歉,我确信这个问题以前出现过,但似乎没有一个例子适用。
我正在尝试创建一个二维列表(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', '', ''], ['', '', ''], ['', '', '']]
关于python - Python中的二维列表重复随机数赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55262858/