最近,我在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
时,但我不知道如何解释它。有人可以解释一下发生了什么以及如何解决它吗?
答案 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)[:]