Django список всех объектов с пользовательской информацией для ошибки цикла - PullRequest
0 голосов
/ 03 марта 2012

Я использую Django для создания сайта, главным образом, чтобы узнать что-то о создании веб-сайтов. И я наткнулся на то, что мне показалось странным. У меня есть следующий код:

all_words=Word.objects.all()[0:100]
    user=request.user
    wordlist = []
    //wordinfo = {} --->This doesn't work
    for word in all_words:
        wordinfo = {}//This works fine
        taged_word = FlagWord.objects.filter(word = word,user = user)
        if taged_word :
            wordinfo['usertag'] = True
        else:
            wordinfo['usertag'] = False
        wordinfo['word'] = word
        wordlist.append(wordinfo)

Обратите внимание, где находится wordinfo. Я думаю, что оба будут работать, потому что последний контент в любом случае заменит предыдущий. Но когда он будет помещен вне цикла for, я получу 100 элементов в wordlist, который все свойства одинаковы. Свойство word будет последним word в all_words.

Я знаю, если wordinfo находится в цикле for, будет создан новый wordinfo. Но вопрос в том, я думаю, если он находится вне цикла for, он также должен работать. объясните мне, в чем разница? Почему его нельзя поместить вне цикла for?

1 Ответ

1 голос
/ 03 марта 2012

в переменных Python ссылаются на объекты. поэтому, когда wordinfo находится вне цикла, на содержащиеся в нем значения ссылается ваш список значений.

Это означает, что на вашей последней итерации все значения в списке слов будут равны последнему значению, присвоенному wordinfo

так что в конце цикла у вас будет

wordlist = [wordinfo, wordinfo, wordinfo, wordinfo] # 100 times

если wordinfo eaual для {'usertag': True, 'word': 'because'}, все элементы в списке будут иметь это значение.

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

  all_words=Word.objects.all()[0:100]
  user=request.user
  wordlist = []
  for word in all_words:
    taged_word = FlagWord.objects.filter(word = word,user = user)
    usertag = False
    if taged_word :
        usertag = True
    wordlist.append({'word': word, 'usertag': usertag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...