模块'对象没有属性'choice' - 尝试使用random.choice
有人能告诉我我可能哪里做错了吗?我在运行我的Python代码时,总是收到这个消息:
import random
foo = ['a', 'b', 'c', 'd', 'e']
random_item = random.choice(foo)
print random_item
错误
AttributeError: 'module'对象没有'choice'这个属性
6 个回答
简单来说,Python在找第一个名为“random”的文件,但没有找到“choice”这个属性。
99.99%的情况下,这意味着你的文件夹里已经有一个叫“random”的文件。如果是这样的话,改个名字再试试。应该就能正常工作了。
我也遇到过这个错误,是因为我把一个方法命名为 random
,像这样:
import random
def random():
foo = ['a', 'b', 'c', 'd', 'e']
random_item = random.choice(foo)
print random_item
random()
这不是你的情况(命名一个文件为 random.py
),但对于其他搜索这个错误的人来说,他们可能会犯这个错误。
听起来像是导入的问题。你在同一个文件夹里有没有叫做 random
的其他模块?如果有的话(而且你用的是python2,这从 print random_item
可以看出来),那么它就会导入那个模块。尽量不要用内置名称来命名你的文件。
你可以用下面的代码来测试一下:
import random
print random.__file__
实际的 random.py
模块在标准库里,路径是 path/to/python/lib/random.py
。如果你的模块在别的地方,这段代码会告诉你它在哪里。
在我的情况下,问题出在我使用了 random.choices()
,而我用的是 python 3.5。这个功能其实是从 python 3.6 开始才有的。
如果你在用 python 3.5 或 2.7,可以改用 random.sample()
,但不要使用 weights 或 cum_weights 这些参数,因为它们是 random.choices()
中才有的。你可以在这里查看相关文档:这里。
随便猜猜:你可能把你的脚本命名为 random.py
。不要把你的脚本命名为和模块一样的名字。
我这么说是因为 random
模块确实有一个 choice
方法,所以在导入的时候可能会导入到错误的(也就是不想要的)模块。