.pop()
实际上返回并删除了 list 的最后一个元素sufijos_png
,因此按照上面的逻辑,它可能会在某个时候尝试n_img-1
从 list中删除 index 处的元素,而该元素sufijos_png
不再存在。为了演示,让我们以您给出的示例为例:
sufijos_png = list(range(1, 10+1))
sufijos_png
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
注意len(sufijos_png)
= 10。现在,我们第一次从 中随机选择一个值sufijos_png
。假设值是9
,所以
n_img = random.choice(sufijos_png)
n_img
9
然后我们弹出(+返回)位置的n_img-1 = 9-1 = 8
值sufijos_png
。
sufijos_png.pop(n_img-1) # pops value at index position 8
sufijos_png
[1, 2, 3, 4, 5, 6, 7, 8, 10]
现在,想象下一个随机抽取sufijos_png
等于 10(它是仍然保留在那里的值之一)。但是,现在的长度sufijos_png
是 9,所以索引范围是 0-8。因此,以下将引发IndexError
:
n_img = random.choice(sufijos_png)
n_img
10 # one of the remaining possible values in sufijos_png
sufijos_png.pop(n_img-1) # pops value at index position 10, which doesn't exist
IndexError: pop index out of range
克服这个问题的一种方法,假设您只需要一个不重复的随机数来分配给self.player.n_loteria = n_img
,是生成一个数字/值列表,然后生成shuffle
它们,然后从这个随机排序的列表中不断弹出。例如:
import random
sufijos_png = list(range(1, 10+1))
random.shuffle(sufijos_png) # just need to shuffle once
def vars_for_template(self):
n_img = sufijos_png.pop() # every time you accessing, you're depleting the list
self.player.n_loteria = n_img
return dict(
image_path='dict/G{}.png'.format(n_img)
)