我正在使用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
循环之外?
答案 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)