2012-03-03 4 views
0

Я использую Django для создания сайта в основном, чтобы узнать что-то о websie building.And я наткнулся на что-то я думал, что это strange.I этот код ниже:Джанго все объекты с конкретным пользователем информация для ошибки контура

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 будет created.But вопрос я думаю, если оно находится за пределами цикла for, он также должен work.Can кто-нибудь объяснить мне, в чем разница? Почему он не может быть помещен за рамки for?

+0

что не работает, когда вы размещаете 'wordinfo = {}' за пределами 'for' цикла? – dm03514

ответ

1

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

Это означает, что на последнюю itearation все значения в словнике будут равны последним значение, присвоенное 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) 
+0

Это означает, что при вашей последней итерации все значения в списке слов будут равны последнему значению, присвоенному wordinfo ... Я думал, что каждый цикл имеет значение wordinfo, будет отличаться ... Это имеет какое-то отношение к ленивой оценке или что нибудь? – Gnijuohz

+0

@Gnijuohz, ленивая оценка связана с запросами django. https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy – dm03514

+0

Я не совсем понимаю, что если я получаю объект из базы данных с использованием метода фильтрации, я что я точно знаю, что будет только один объект, но я должен использовать для цикла, чтобы повторить его в моем шаблоне, или он поступил неправильно. Почему? (Мне жаль, что это другой вопрос: P) – Gnijuohz

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