将python random.choice与list.append()结合使用

时间:2018-03-14 20:01:34

标签: python random append

最近,我在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.appendrandom.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.choicelist.append时,但我不知道如何解释它。有人可以解释一下发生了什么以及如何解决它吗?

1 个答案:

答案 0 :(得分:0)

首先,我打开REPL提示符并运行您的第一段代码

admin_get_user

看起来还不错,但是如果您检查>>> 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) [[4, 1, 'a'], [3, 4, 'b'], [1, 2, 'c']]

会怎样?
pair

因此,通过附加到>>> pair [[1, 2, 'c'], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4, 'b'], [4, 1, 'a'], [4, 2], [4, 3]] 返回的列表中,您已经无意中修改了choice(pair)

这是因为pair不会复制子列表。

如果您打算复制子列表,请使用

choice(pair)

list[0] = choice(pair)[:]