2014-03-29 54 views
1

我試圖在當前循環範圍之外設置一個變量。如何在Python中的循環之外設置變量

我的場景是這樣的:我有2個列表。一個包含評論對象列表,每個評論都有一個對用戶標識的引用。我的第二個列表包含基於用戶標識的所有用戶對象。

我想要做的是遍歷每個評論,然後修改列表中的評論對象以包含用戶名,以便當我將評論列表傳回時,它具有嵌入的名稱。

到目前爲止,我如何努力實現這一點:

# iterate through the comments and add the display name to the comment obj 
for comment in comments: 
    # Create the user to use later 
    user = None 

    # Iterate the comment_users and get the user who matches the current comment. 
    for comment_user in comment_users: 

     if comment_user['_id'] is comment['created_by']: 
      user = comment_user # this is creating a new user in the for comment_user loop 
      break 

    print(user) 

    # get the display name for the user 
    display_name = user['display_name'] 

    # Add the user display name to the comment 
    comment.user_display_name = display_name 

現在,從什麼我開始從Python的範圍理解,就是在第二個for循環用戶= comment_user行創建第二個for循環範圍內的一個新用戶變量,它忽略了第一個for循環中定義的用戶變量。我使用的是Python 3,所以我認爲nonlocal關鍵字是要走的路,但我不確定這是否只是函數,因爲我不能讓它工作。

所以,我想知道是否有人可以提供一種方法來實現這一目標?有沒有更多'pythonic'的方式來實現這一目標?

+0

不,這ISN字典不會發生什麼事情。 Python沒有塊範圍。 –

+1

我不認爲你對範圍有問題,但爲什麼不在「if」塊中設置註釋的用戶名呢? – Selcuk

+0

感謝您對塊範圍的幫助,有助於瞭解未來。 – Juzzbott

回答

2

我認爲問題在於你的使用is。試試這個代碼:

for comment in comments: 
    for comment_user in comment_users: 
     if comment_user['_id'] == comment['created_by']: 
      comment.user_display_name = comment_user['display_name'] 
      break 

當你使用is比較string對象(不正確地)出現此問題。等號運算符(==)檢查兩個字符串的內容是否相同,而is運算符實際檢查它們是否是相同的對象。如果字符串是interned,它們可能會給出相同的結果,但一般來說,您不應該使用is進行字符串比較。

+0

謝謝!這是使用'is'關鍵字。現在我需要閱讀這些內容,並確保我不會在別處濫用它。 – Juzzbott

2

我覺得更pythonic的方法是使comment_user具有_id爲重點,這樣你就不必遍歷列表中,但可以做

for comment in comments: 
    comment.user_display_name = comment_user[comment['created_by']]['display_name'] 
+0

感謝您的建議。我的comment_users是一個pymongo遊標,所以我只是覺得嘗試和循環都會更容易。我會查看一下它是一本字典。 – Juzzbott

相關問題