【发布时间】:2018-03-14 20:01:34
【问题描述】:
最近,我在使用 Python 的 random.choice 函数时遇到了一些问题。
我希望我添加的示例脚本打印出一个包含 3 个项目的列表。这些项目中的每一项都应该是一个包含两个整数和一个字符串的列表。
例如:[[1, 4, 'a'], [2, 1, 'b'], [3, 4, 'c']]
from random import choice
pair = [
[1, 2], [1, 3], [1, 4],
[2, 1], [2, 3], [2, 4],
[3, 1], [3, 2], [3, 4],
[4, 1], [4, 2], [4, 3]
]
list = [0, 0, 0]
list[0] = choice(pair)
list[0].append('a')
list[1] = choice(pair)
list[1].append('b')
list[2] = choice(pair)
list[2].append('c')
print(list)
脚本在大多数情况下都按预期工作。然而,有时它会打印出如下内容:
[[3, 2, 'a', 'c'], [4, 3, 'b'], [3, 2, 'a', 'c']]
列表中的两个项目不仅由一个字符串组成太多,而且由于某种原因它们是相同的。
首先,我认为这与append 函数有关。
但是,当我像这样删除 random.choice 组件时:
list = [0, 0, 0]
list[0] = [1, 2]
list[0].append('a')
list[1] = [2, 3]
list[1].append('b')
list[2] = [3, 4]
list[2].append('c')
print(list)
它仍然可以正常工作,没有任何缺陷。
random.choice 函数也一样,它本身不会导致任何问题:
from random import choice
pair = [
[1, 2], [1, 3], [1, 4],
[2, 1], [2, 3], [2, 4],
[3, 1], [3, 2], [3, 4],
[3, 1], [3, 2], [4, 3],
list = [0, 0, 0]
list[0] = choice(pair)
list[1] = choice(pair)
list[3] = choice(pair)
print(list)
接下来我测试了当列表只包含一项并且list.append 和random.choice 只执行一次时会发生什么
from random import choice
pair = [
[1, 2], [1, 3], [1, 4],
[2, 1], [2, 3], [2, 4],
[3, 1], [3, 2], [3, 4],
[4, 1], [4, 2], [4, 3]
]
list = [0]
list[0] = choice(pair)
list.append('a')
print(list)
这个脚本的行为也符合我的预期。显然我的问题只发生在random.choice 和list.append 在列表中的不同项目上执行多次时,但我不知道如何解释。有人可以解释发生了什么以及如何解决吗?
【问题讨论】:
-
您正在将配对本身放入您的列表中。然后,当您附加到它们时,您将永久修改它们;如果稍后随机选择同一对,则它已经附加了一个字母。一种解决方案是在修改它们之前将它们的副本放在列表中:例如
list[0] = choice(pair)[:]。 -
对于第一个示例,我无法重现该问题(我松了一口气)。我得到
[[3, 2, 'a'], [2, 3, 'b'], [2, 1, 'c']]。choice每次返回一个不同的列表。你能创建一个更短的minimal reproducible example 预期输出和实际输出吗?