2015-07-12 107 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