2013-07-27 9 views
2

У меня есть список, который должен содержать переменное количество независимых множеств. Когда я запускаю следующий фрагмент кода, я хочу добавить строку «тестирование» только к первому набору.Как создать список независимых наборов в python?

numberOfSets = 3  
test = [set()]*numberOfSets 
test[0].add("testing") 
print test 

Однако, когда я печатаю test, он показывает три одинаковых наборов, которые содержат тестирование. Как я могу настроить свой список, чтобы я мог отдельно обращаться к каждому набору?

+0

ЗАКАНЧИВАТЬ [мой ответ] (http://stackoverflow.com/a/12791510/198633) на [подобный вопрос] (http://stackoverflow.com/q/12791501/198633) – inspectorG4dget

+0

@ inspectorG4dget Да, это то, о чем я просил. – fdsa

ответ

4

Когда вы делаете [set()]*3, вы создаете три набора, которые ссылаются на один и тот же объект, поэтому при изменении одного значения другие изменяются. Используйте список понимание здесь вместо:

>>> numberOfSets = 3 
>>> test = [set() for _ in xrange(numberOfSets)] 
>>> test[0].add("testing") 
>>> print test 
[set(['testing']), set([]), set([])] 
+0

Спасибо, я согласен через 10 минут – fdsa

+0

@fdsa Добро пожаловать :). – TerryA

+0

Поскольку мы знаем, что OP использует Python 2.7, вы можете обновить этот ответ, чтобы использовать 'xrange'; это более уместно для этой ситуации. – arshajii

4

Вы можете сделать

test = [set() for _ in xrange(numberOfSets)] # use 'range' in Python 3.x 

[set()]*x создает список с x из множества, например в же, в то время как понимание выше создает новый, независимый набор на каждой итерации, как хотелось бы.

В общем, вы должны быть очень осторожными при умножении списков, чьи элементы изменяемы.

+0

Благодарим за информацию. Я использую Python 2.7, поэтому я буду принимать другой ответ. – fdsa

+0

Любопытно, почему я должен быть осторожным перемножением списков, чьи элементы изменяемы? – fdsa

+0

@fdsa 'xrange' лучше для 2.7, как показано выше. Я имел в виду, что вы должны использовать 'range' в 3.x. – arshajii

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