【问题标题】:list() a function? Or class name?list() 一个函数?还是类名?
【发布时间】:2020-12-20 13:46:29
【问题描述】:

您已经知道 python 中使用的 list() 。我们使用它来创建一个列表,要么是一个空列表,要么来自其他可迭代对象,例如元组、集合等。

考虑以下几点:

list1=list()
t=(1,2,3)
list2=list(t)

我的主要疑问是,名称'list'是一个名为list的单独函数还是类'list'的名称?

我怀疑的原因是,创建对象的语法是:

obj_name=class_name()

我们已经按照语法创建了对象 list1 和 list2

还有

help(list)

Output : 
Help on class list in module builtins:

class list(object)
     .....
     .....
     .....
     __hash__=None

仅提供有关班级列表的信息。而对于其他内置函数,例如 len(),help() 提供函数的信息

help(len)

Output : 
Help on built-in function in module builtins:

len(obj, /)
     Return the number of items in a container.

因此,这里是否使用 list() 作为类名来定义其对象???

或者是否有一个单独的函数来创建一个名为 list() 的 'list' 类型的变量???

更具体地说,在我的问题中,在上面的代码中,list() 是作为类名还是函数名?

如果它是一个内置函数,我可以得到为它编写的代码吗???

提前致谢

【问题讨论】:

  • 这是一个类,而不是一个函数。类只是对象,就像 Python 中的所有其他东西一样,int 对象,dict 对象,甚至函数对象和类对象。所有类都是type 的实例,它本身就是一个类(一个元类,一个创建类的类)

标签: python list function class object


【解决方案1】:

我对以上答案很满意。我什至奖励最合适的答案。但我什至对那个答案有一定的怀疑,他也回答了。我想为我的问题提供另一个答案,我想将所有这些都编译为答案。

First of list() 是一个类名,更具体地说是一个类型名。它不是一个函数。我很确定。类似地,其他数据类型如 bool、int、float、complex、set、tuple、dictionary、frozenset、str 等也是类。

要验证我的观点,只需使用 help():

>>>help(list) # or any type you want

它给出了该类列表的描述。

有时我们会有疑问。如果 list() 不是函数,那么为什么它会被包含在 python 官网提供的内置函数列表中。 www.python.org

这是链接:https://docs.python.org/3/library/functions.html

这也是我提出的问题。

我的回答是。这是传统的。一旦它们是函数。在这里查看:https://docs.python.org/release/1.5/lib/node26.html#SECTION003300000000000000000

因此,即使在这个版本中,他们也遵循相同的原则。

希望对读者有所帮助

【讨论】:

    【解决方案2】:

    list 是一个built-in class,作用域名称list 是对list 类的引用。调用list(...) 隐式调用此类的构造函数list.__init__(),它根据可选提供的参数创建列表的新对象实例。在全局范围内只有一个list 变量可用——它是一个,而不是一个函数

    查看以下 Python REPL 输出:

    # the 'list' definition is a class, not a function
    >>> list
    <class 'list'>
    >>> type(list)
    <class 'type'>
    
    # lists are actually instances of the 'list' builtin class.
    >>> type(list())
    <class 'list'>
    >>> type([])
    <class 'list'>
    

    len 这样的全局范围的内置函数是一个内置函数而不是一个类;即它不是构造函数,也不会初始化新的对象实例。

    查看以下 Python REPL 输出:

    >>> type(len)
    <class 'builtin_function_or_method'>
    

    这个内置函数与 Python 中声明的函数不同。

    查看以下 Python REPL 输出:

    >>> def test():
    ...    ...
    ...
    >>> type(test)
    <class 'function'>
    

    list 的源代码在 C 中本地实现,可在 GitHub 存储库中获得:https://github.com/python/cpython/blob/master/Objects/listobject.c


    有关内置类型的更多文档,请查看以下参考资料:

    【讨论】:

    • 哇,这正是我所需要的。此外, list() 是一个构造函数。那我们为什么要把它包含在内置函数列表中???见这里:docs.python.org/3/library/functions.html#func-list
    • 在Java等语言中,实例化对象需要new关键字(例如new ArrayList&lt;&gt;(...));没有new,它会寻找一个方法。 Python 采用不同的方法来构建新的对象实例。类既是类又是一种伪函数。当调用一个类(例如list())时,通过执行类的内部__init__函数来创建一个新对象。在功能上,没有区别——list() 的调用接受参数并返回数据,就像任何其他函数一样;它只是技术上不是正常意义上的“功能”。
    • 可以是正常意义上的。但是,官方 python 网站告诉我们。如何???他们知道它的内部结构和功能对吗??
    • @SanmithaSadhishkumar 我想您可以将类视为一种特殊 类型的函数,不要与def func(): 显式声明的函数相混淆。出于实际目的,无论是类、内置函数还是def'd 函数,最终结果实际上是相同的。调用其中任何一个都接受参数并可能返回一个值——函数背后的核心概念。重申一下 - 在全局范围内只有一个 list() 定义 - 它是一个类,一种 特殊 类型的函数,在后台有更复杂的调用。
    • 请查看我的回答
    【解决方案3】:

    list 是绑定到类型的内置作用域中的名称。像大多数类型一样,list 可以调用以创建该类型的新实例。它期望的参数是用于填充新列表的任意可迭代值。

    >>> type(list)
    >>> type(list)
    <class 'type'>
    >>> type(list((1,2,3,)))
    <class 'list'>
    >>> type(list(range(3)))
    <class 'list'>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 2016-04-05
      • 2013-09-18
      • 2015-06-15
      • 1970-01-01
      • 2019-05-08
      • 2012-06-02
      • 2023-02-01
      相关资源
      最近更新 更多