Вчем разница между двумя способами создания списка

436 просмотра
0
0 Комментариев

list(string[:2]) + [string[2:]]
 
['S', 'p', 'am']

Кажется, что они делают одно и тоже но результат разный, и первая и вторая часть создают список, но по-разному, почему так?


Добавить комментарий

2 Answers

Python Опубликовано 14.12.2018
0

По-моему разница в том, что конструктор list() проверяет является ли переданный ему аргумент итерируемым объектом и в том случае если это итерируемый объект — конструктор вернет список объектов возвращенных итератором. «list literal» [] таких проверок не делает — он просто создает список из переданных объектов.

Пример:

def f(n):
    for i in range(n):
        yield i
 
In [23]: list(f(10))
Out[23]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
In [24]: [f(10)]
Out[24]: [<generator object f at 0x000000000A891F68>]

тоже самое происходит со строками (string в Python — итерируемый объект)

In [25]: list('abc')
Out[25]: ['a', 'b', 'c']
 
In [26]: ['abc']
Out[26]: ['abc']

проверка на итерируемость:

In [27]: import collections
 
In [28]: isinstance('abc', collections.Iterable)
Out[28]: True

Также [] отрабатывает быстрее чем list(), т.к. list() требует поиска в таблице методов:

In [64]: %timeit []
22.1 ns ± 0.0214 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
 
In [65]: %timeit list()
126 ns ± 3.6 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

Добавить комментарий
0
  1. В Python список не «объявляется». Но это неважно.
  2. Первая строка склеивает строку из двух частей целого, а list() разбивает на список, состоящий из символов.
  3. [‘S’, ‘p’, ‘am’] — создает список из трех элементов.
  4. если вы имели ввиду, что string = ‘Spam’, то надо было так и написать. А чтобы оно делало то же самое что и вторая строка — надо сделать следующее:

[string[0], string[1], string[2:]]

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up