Создание списка в Python - что-то подлое происходит? - PullRequest
10 голосов
/ 29 апреля 2010

Извинения, если это не имеет никакого смысла, я очень плохо знаком с Python!

Из тестирования в интерпретаторе я вижу, что list() и [] оба создают пустой список:

>>> list()
[]
>>> []
[]

Из того, что я узнал до сих пор, единственный способ создать объект - это вызвать его конструктор (__init__), но я не вижу этого, когда просто набираю []. Таким образом, выполняя [], Python затем отображает это на вызов list()?

Ответы [ 7 ]

13 голосов
/ 29 апреля 2010

Эти две конструкции обрабатываются совершенно по-разному:

>>> import dis
>>> def f(): return []
... 
>>> dis.dis(f)
  1           0 BUILD_LIST               0
              3 RETURN_VALUE        
>>> def f(): return list()
... 
>>> dis.dis(f)
  1           0 LOAD_GLOBAL              0 (list)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE        
>>> 

Форма [] создает список с использованием кода операции BUILD_LIST, тогда как форма list() вызывает конструктор объекта list.

7 голосов
/ 29 апреля 2010

Нет, Python не вызывает list(), или вы можете повлиять на тип [], назначив ему список, который вы не можете:

>>> import __builtin__
>>> __builtin__.list = set
>>> list()
set([])
>>> []
[]

[] - это синтаксис для создания списка,Это встроенный тип, и он имеет специальный синтаксис, точно так же как dicts, string, ints, float и множество других типов.

Создание экземпляров типов может также быть выполнено путем вызова типакак list() - который в свою очередь вызовет для вас конструктор и инициализатор типа.Непосредственный вызов инициализатора (__init__) не создает новый экземпляр типа.Вызывает конструктор (__new__), но вы не должны вызывать его напрямую.

5 голосов
/ 29 апреля 2010

Я начал изучать Python вчера .... Я думаю, что вы должны были бы сказать, что это внутренне сопоставлено

>>> a = []
>>> type(a)
<type 'list'>
>>> a = list()
>>> type(a)
<type 'list'>
4 голосов
/ 29 апреля 2010

В дополнение к другим ответам, из Справочник по языку :

Отображение списка - это, возможно, пустая серия выражений, заключенная в квадратные скобки:

list_display        ::=  "[" [expression_list | list_comprehension] "]"
...

Отображение списка дает новый объект списка.

В нем явно не упоминается, как реализовано «получение нового объекта списка». Это может быть вызов конструктора list(), как вы упомянули. Или, может быть, списки, будучи настолько элементарными, получают специальную обработку, и list() фактически сопоставляется с чем-то совершенно другим.

В любом случае, [] определенно не отображается на вызов конструктора типа с именем __builtins__.list, потому что переопределение этого типа все еще заставляет [] возвращать фактический список, как показали другие ответчики. *

3 голосов
/ 29 апреля 2010

Python, как и большинство языков программирования, имеет то, что называется literal , что означает, что специальный синтаксис может использоваться для записи некоторых из наиболее важных типов значений. Очень мало этого необходимо, но это облегчает использование Python, поскольку мы можем писать литералы.

>>> 0
0
>>> int()
0
>>> 5
5
>>> int('5') # I'm using a string literal here though!
5
>>> 0.0
0.0
>>> float()
0.0
>>> "" 
''
>>> str()
''
>>> u""
u''
>>> unicode()
u''
>>> ()
()
>>> tuple()
()
>>> {}
{}
>>> dict()
{}     

Когда мы создаем свои собственные типы (классы), мы создаем их экземпляры, используя их конструкторы, например list для списков. Когда мы используем литералы, это как синтаксический сахар для вызова list, но в действительности это вызывает те же самые базовые вещи за сценой.

2 голосов
/ 05 декабря 2018

В чем основные различия между использованием list () и []?

Самым очевидным и видимым отличием между list () и [] является синтаксис. Оставив здесь на минуту синтаксис, кто-то, чей новый или промежуточный контакт с python может утверждать, что они оба являются списками или происходят от одного и того же класса; это правда. Что, кроме того, повышает важность понимания основных различий между ними, большинство из которых изложены ниже.

list () - это функция, а [] - буквальный синтаксис .

Давайте посмотрим, что происходит, когда мы вызываем list () и [] соответственно через дизассемблер.

>>> import dis
>>> print(dis.dis(lambda: list()))
  1           0 LOAD_GLOBAL              0 (list)
              3 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
              6 RETURN_VALUE
None
>>> print(dis.dis(lambda: []))
  1           0 BUILD_LIST               0
              3 RETURN_VALUE
None

Вывод вышеприведенного дизассемблера показывает, что для буквального синтаксиса версия не требует глобального поиска, обозначенного кодом операции LOAD_GLOBAL или вызовом функции, обозначенным кодом операции CALL_FUNCTION.

В результате буквальный синтаксис работает быстрее, чем его аналог. - Давайте возьмем секунду и посмотрим на сроки ниже.

import timeit
>>> timeit.timeit('[]', number=10**4)
0.0014592369552701712
>>> timeit.timeit('list()', number=10**4)
0.0033833282068371773

С другой стороны, не менее важно и стоит отметить, что буквальный синтаксис [] не распаковывает значения. Пример распаковки показан ниже.

>>> list('abc') # unpacks value
['a', 'b', 'c']
>>> ['abc'] # value remains packed
['abc']

Что такое литерал в питоне?

Литералы - это обозначения или способ записи значений констант или необработанных переменных, которые python распознает как встроенные типы.

Источник из моего поста PythonRight - в чем разница между списком и [] .

1 голос
/ 13 ноября 2018

С:

class list(object):
    """
    list() -> new empty list
    list(iterable) -> new list initialized from iterable's items
    """

Если элемент в ваших списках - iterable (то есть str), list() и [] не работают одинаково.

So

>>> a = ['ab']
>>> b = list('ab')
>>> a[0]
'ab'
>>> b[0]
'a'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...