为什么叫`import random; random.random()`抛出一个TypeError?

时间:2014-12-30 09:12:34

标签: python-2.7 python-import

我是Python的新手。我写了一个小脚本来生成十个随机浮点值,但它仍然失败。这是脚本:

import random

for i in range(10):
  x = random.random()
  print x

这是错误信息:

TypeError: 'module' object is not callable'.

我看不出问题所在。 我很确定随机存在!

我的版本是Python 2.7.6。

1 个答案:

答案 0 :(得分:1)

如果将以下代码保存到random.py

import random
print(__name__)
print(random)
print(random.random)

然后运行它,然后输出类似:

的内容
random
<module 'random' from '/.../python/import/name-shadowing/random.py'>
<module 'random' from '/.../python/import/name-shadowing/random.py'>
__main__
<module 'random' from '/.../python/import/name-shadowing/random.py'>
<module 'random' from '/.../python/import/name-shadowing/random.py'>

即,randomrandom.random都指向同一个模块 - 您的本地random.py,它会从标准库中隐藏random模块。

也许它的工作原理如下:

  1. python -mrandom在当前目录中找到random.py,将其导入为random,然后开始将其作为__main__运行。
  2. 它会看到import random并导入缓存的模块。
  3. print(random)将模块对象的表示打印到stdout。
  4. print(random.random)random模块中查找random个名称。它找到它(名称指的是模块本身。它打印出来。
  5. 解决方案是避免遮蔽名称。避免为了可读性而隐藏标准名称。如果您可以在代码中使用它们,请避免隐藏第三方名称。

    如果当前目录不在sys.path中,则导入stdlib模块:

    import sys
    sys.path.pop(0) # assume the script directory is the first in the Python path
    import random
    print(__name__)
    print(random)
    print(random.random)
    

    输出

    __main__
    <module 'random' from '/usr/lib/python3.4/random.py'>
    <built-in method random of Random object at 0x1aaf7f8>
    

    注意:它仅用于说明。避免修改脚本中的sys.path