如何在python中设置循环外的变量

时间:2014-03-29 13:21:38

标签: python for-loop scope

我试图将变量设置在当前循环范围之外。

我的情况是:我有2个列表。一个包含评论对象列表,每个评论都有一个用户ID的引用。我的第二个列表包含基于用户ID的所有用户对象。

我要做的是遍历每个注释,然后修改列表中的注释对象以包含用户名,这样当我传回注释列表时,它就会嵌入名称。

到目前为止,我正在努力实现这一目标:

# 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循环中的user = comment_user行是在第二个for循环的范围内创建一个新的用户变量,这是忽略的第一个for循环中定义的用户变量。

我使用的是Python 3,所以我认为非本地关键字是可行的方式,但我不确定这是否仅适用于功能,因为我无法做到让它工作。

所以,我想知道是否有人能提供实现这一目标的方法?还有更多' pythonic '实现这个目标的方法?

2 个答案:

答案 0 :(得分: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进行字符串比较。

答案 1 :(得分:2)

我认为更加pythonic的方法是让comment_user成为一个以_id为键的字典,这样你就不必循环遍历列表但只能做

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