2015-07-12 113 views
1

所有:内容)第一字典(后空

在Django中,我用这句话来获取字典(q_a),但第一个字典()之后,第二个是空,蟒蛇是如何工作的为了那个原因?

if request.method == "POST": 
    q_a = request.POST.iteritems() 
    print "type of q_a is %s" % q_a 
    print "first dict(q_a) : %s " % dict(q_a) 
    print "second dict(q_a): %s " % dict(q_a) 

下面是打印输出:

type of q_a is <generator object _iteritems at 0x10c97ac30> 
first dict(q_a) : {u'csrfmiddlewaretoken': u'KQA7K6MCwZWFsXO59pAOYOMyD92O9tYq', u'\u5b66\u9662': u'ss', u'\u59d3\u540d': u'ww', u'\u624b\u673a\u53f7\u7801': u''} 
second dict(q_a): {} 
+0

这是一个奇怪的空[iterator]案例(https://docs.python.org/2/glossary.html#term-iterator)。 –

+0

'help(dict.iteritems)'。 – juanchopanza

回答

2

request.POST.iteritems()返回一个生成对象,并将其在第一dict呼叫后用完。

if request.method == "POST": 
    q_a = dict(request.POST.iteritems()) 
    print "first dict(q_a) : %s " % q_a 
    print "second dict(q_a): %s " % q_a 
+0

**错误的术语:'iteritems()'返回一个[**迭代器**](https://docs.python.org/2/glossary.html#term-iterator)而不是[** generator ** ](https://docs.python.org/2/glossary.html#term-generator)。一个生成器也有像'send','close','throw'等方法,但是迭代器不会。 –

+0

没错,感谢您的警告。我总是混合使用这些术语,因为生成器也是迭代器,但反之亦然。 – ozgur

+0

或者你可以改变它来说'request.POST.iteritems()'在Django中返回一个生成器,因为只提到'iteritems'部分有点含糊。 –

0

q_a.iteritems()是不是一本字典,它是一个生成器(如印刷说)。您可以在Python Wiki上阅读更多关于它们的信息,但通常您只能遍历它们一次。之后,当你尝试迭代它们时(如你隐含在你最后一行使用dict(q_a))来停止循环,它们将会产生一个StopIteration。这就是为什么你的电话会产生一个空的字典。

+0

谢谢,我会检查Python Wiki。 – Cheer

0

.iteritems()返回iterator对象。

A generator也是iterator。发生器将提供一个值序列而不是一个迭代器的情况。

第一次调用后,它会生成值,然后变为空。当你打第二个电话时,它会显示一个空字典。

当您需要在您的代码中只使用一次特定值时使用它们。

+0

明白了,非常感谢。 – Cheer