Добавить значение к элементу в списке наборов - PullRequest
1 голос
/ 28 апреля 2010

Я использую Python, и у меня есть список множеств, сконструированный так:

list = [set([])]*n

... где n - количество наборов, которые я хочу в списке. Я хочу добавить значение к определенному набору в списке. Скажем, второй сет. Я пытался

list[1].add(value)

Но вместо этого это добавляет значение к каждому , установленному в списке. Такое поведение довольно не интуитивно для меня. В ходе дальнейших тестов, я думаю, я нашел проблему: список, очевидно, содержит 10 экземпляров одного и того же набора, или десять указателей на один и тот же набор, или что-то еще. Построение списка с помощью повторных вызовов

list.append(set([]))

позволил мне использовать приведенный выше синтаксис для добавления элементов в отдельные наборы. Поэтому мой вопрос таков: что именно происходит в моей первой технике построения списка? Понятно, что я не очень хорошо понимаю синтаксис. Кроме того, есть ли лучший способ инициализировать список из n элементов? Я использовал этот синтаксис некоторое время, и это моя первая проблема с ним.

Ответы [ 2 ]

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

Вы в значительной степени суммировали проблему самостоятельно - синтаксис X*n создает один экземпляр X и включает его n раз. Это не проблема для таких вещей, как 'a'*10, потому что не имеет значения, что каждый символ в этой строке указывает на одно и то же «a», но это имеет значение для изменяемых конструкций, таких как списки и множества. Вы можете сделать n отдельных наборов, используя понимание списка:

list = [set() for x in xrange(n)]
1 голос
/ 28 апреля 2010

Да, это правильно. Синтаксис * просто копирует ссылку много раз. Ваш метод работает нормально, или вы можете использовать понимание списка, чтобы построить столько множеств, как в:

list = [set([]) for x in xrange(n)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...