2016-01-22 2 views
1

Я заметил странную разницу между двумя конструкторами списков, которые, как я полагал, эквивалентны.В чем разница между списком (a) и [a]?

Вот небольшой пример:

hello = 'Hello World' 

first = list(hello) 
second = [hello] 

print(first) 
print(second) 

Этот код будет производить следующий вывод:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'] 
['Hello World'] 

Таким образом, разница вполне ясно между двумя конструкторами ... И, я думаю, что это можно было бы обобщить и на другие конструкторы, но я не понимаю логики этого.

Может ли кто-нибудь направить свои огни на мои допросы?

+3

Вы прочитали документацию? https://docs.python.org/3.5/library/stdtypes.html#typesseq-list – deceze

+0

Попробуйте '[x for x in hello]' – imreal

ответ

8

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

[] принимает столько «аргументов», сколько вам нравится, каждый из которых является единственным элементом в списке; элементы не «оцениваются» или не повторяются, они принимаются как есть.

Все as documented.

0
first = list(hello) 

преобразует строку в список.

second = [hello] 

Это место, чтобы товар был добавлен в новый список. он не является конструктором

1

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

свой «второй» создает новый список, используя строку в качестве значения

2

Первый раз преобразовать список «Привет мир» (массив символов) в список

first = list(hello) 

Второй создать список с элементом внутри скобок.

first = [hello] 

Во втором случае, например, вы могли бы также сделать:

first = [hello, 'hi', 'world'] 

и в качестве выхода из печати вы получите

['Hello World', 'hi', 'world'] 
+0

Незначительный nitpick: 'list()' ничего не преображает; он просто создает новый список с заданным итерабельным. – chepner

1

Вы полагаете, что list(hello) должны создать список содержащий один элемент, объект, на который ссылается hello. Это не правда; по этой логике вы ожидаете, что list(5) вернется [5]. list принимает один итерационный аргумент (список, кортеж, строка, dict и т. Д.) И возвращает список, элементы которого берутся из заданного итерабельного.

Номенклатура скобок, однако, не ограничивается содержанием одного элемента. Каждый объект, разделенный запятыми, рассматривается как отдельный элемент для нового списка.

1

Самое важное различие этих двух видов поведения происходит, когда вы работаете с генераторами. Учитывая, что Python 3 трансформируются вещи, как map и zip в генераторах ...

Если мы предположим, map возвращает генераторы:

a = list(map(lambda x: str(x), [1, 2, 3])) 
print(a) 

В результате получается:

['1', '2', '3'] 

Но если мы делаем:

a = [map(lambda x: str(x), [1, 2, 3])] 
print(a) 

результат:

[<map object at 0x00000209231CB2E8>] 

Очевидно, что второй случай в большинстве случаев нежелателен и не ожидается.

P.S. Если вы находитесь в Python 2, то в начале: from itertools import imap as map

Смежные вопросы