django列出具有用户特定信息的所有对象的循环错误

时间:2012-03-03 17:23:29

标签: django loops

我正在使用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 个答案:

答案 0 :(得分:1)

在python变量中引用对象。因此,当wordinfo在循环之外时,它包含的值将由您的值列表引用。

这意味着在最后一次迭代中,wordlist中的所有值都将等于分配给wordinfo的最后一个值

所以在循环结束时你会有

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

如果wordinfo是{'usertag': True, 'word': 'because'}的eaual,则列表中的所有项目都将具有该值。

你可以进一步重构这个看起来像:

  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)