【问题标题】:What's the difference in: Import module & From module import module?有什么区别:导入模块和从模块导入模块?
【发布时间】:2011-09-26 21:11:26
【问题描述】:

这是我的程序,它获取一个单词列表并将它们从最长到最短排序,并打破与随机模块的联系。

import random  
def sort_by_length1(words):
    t = []
    for word in words:
        t.append((len(word), random(), word))

    t.sort(reverse = True)


    res = []
    for length, randomm, word in t:
        res.append(word)
    return res

我收到此错误:TypeError: 'module' object is not callable

但是当我这样做时:from module import module 它有效吗?这是为什么呢?

【问题讨论】:

    标签: python random module


    【解决方案1】:
    from random import random 
    

    等价于

    import random as _random
    random = _random.random
    

    如果你只这样做

    import random
    

    你必须使用

    random.random()
    

    而不是

    random()
    

    【讨论】:

    • 虽然确实令人困惑,尤其是对于新的 Python 学习者来说,模块与其方法之一具有完全相同的名称。
    【解决方案2】:

    random 模块有一个random 函数。当您执行import random 时,您将获得模块,这显然是不可调用的。当您执行from random import random 时,您将获得可调用的函数。这就是为什么您在第二种情况下看不到错误的原因。

    您可以在您的 REPL 中对此进行测试。

    >>> import random
    >>> type(random)
    module
    >>> from random import random
    >>> type(random)
    builtin_function_or_method
    

    【讨论】:

      【解决方案3】:
      from random import random
      

      相当于:

      import random          # assigns the module random to a local variable
      random = random.random # assigns the method random in the module random
      

      你不能调用模块本身,但你可以调用它的方法random。具有相同名称的模块和方法只会让人感到困惑;语法清楚地表明了您的意思。

      【讨论】:

      • 那么为什么不直接导入随机作品呢?我对这种语言相当陌生,所以我有点难以理解它的含义。
      • @G.G 因为import random 允许您访问名为random 的导入模块。你不能调用一个模块。
      • 模块与函数是完全不同的概念。巧合的是,在这种情况下,两者同名。
      【解决方案4】:

      当你调用命令时,

      import random
      

      您正在导入包含所有函数和类的模块的引用。此引用现在位于您的命名空间中。现在可以通过random.func(arg1, arg2) 访问随机模块中的好东西。

      这允许您对随机模块执行以下调用:

      >>> random.uniform(1, 5)
      2.3904247888685806
      >>> random.random()
      0.3249685500172673
      

      所以在你上面的代码中,当 python 解释器运行时,

      t.append((len(word), random(), word))
      

      random 实际上是指模块名称并引发错误,因为模块名称不可调用,与您要查找的函数不同,它位于内部。

      如果你改为调用

      from random import random
      

      您将在名称空间中添加对模块random 内的函数random 的引用。您可以轻松地说出from random import randint,这样您就可以毫无问题地拨打randint(1, 5)

      我希望这能很好地说明问题。

      【讨论】:

        猜你喜欢
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2010-10-02
        • 2011-09-11
        • 2012-03-07
        • 1970-01-01
        相关资源
        最近更新 更多