Почему умножение списков Python создает один список с несколькими элементами? - PullRequest
1 голос
/ 30 октября 2019

В питоне ['a'] * 4 дает ['a', 'a', 'a', 'a']. Почему бы не [['a'], ['a'], ['a'], ['a']]?

Ответы [ 3 ]

5 голосов
/ 30 октября 2019

Поскольку, как и при умножении целых чисел, повторяется сложение, умножение на lis повторяется при конкатенации.

>>> ['a'] + ['a'] + ['a'] + ['a']
['a', 'a', 'a', 'a']
>>> ['a'] * 4
['a', 'a', 'a', 'a']
>>> 4 * ['a']
['a', 'a', 'a', 'a']

Это также подчиняется другим законам:

  • Распределение: lst * n + lst * m == lst * (n + m)
  • Нулевое свойство: lst * 0 == 0 * lst == []
  • Мультипликативная идентичность: lst * 1 == lst.

Вышеприведенное также согласуется с пустым списком []являясь аддитивным тождеством,

['a'] + [] == [] + ['a'] == ['a']

, поскольку

['a'] + [] == ['a'] * 1 + ['a'] * 0  # zero property and multiplicative identity
           == ['a'] * (1 + 0)        # distribution
           == ['a'] * 1              # integer addition
           == ['a']                  # multiplicative identity

Возможно, list * int не следует определять в all . Основной вариант использования, чтобы быстро создать список из n идентичных элементов, более безопасен при использовании списочных представлений (которые были добавлены к языку позже). [x] * n создает список ссылок на один элемент x, который обычно не , что вы хотите, если x является изменяемым. [x for _ in range(n)], с другой стороны, создает список независимых объектов, определенных как x, что равно , что вы хотите, когда x является изменяемым.

1 голос
/ 30 октября 2019

Очень похоже на умножение на числа ['a'] * 4 эквивалентно ['a'] + ['a'] + ['a'] + ['a'], следовательно ['a', 'a', 'a', 'a'].

0 голосов
/ 31 октября 2019
  • просто обдумайте это.
['a'] * 4 == ['a'] + ['a'] + ['a'] + ['a']
  • Добавление двух списков должно дать список. Это определенное поведение с python.
  • Если то, что вы говорите, верно, то.
['a'] + ['a'] = [['a'],['a']].
  • И что должно быть выведено из этого?
['a'] + ['a'] + ['a'] = [[['a'],['a']],['a']]  #??

['a'] + ['a'] + ['a'] + ['a'] = [[[['a'],['a']],['a']],['a']] # ?????????
(['a']*2)*3 #  what should be output of this?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...