如何在python中正确地将局部变量分配给for循环?

时间:2017-08-24 03:50:00

标签: python for-loop local-variables

我有一个for - 循环,它在pandas数据帧df_drinks中获取行,并将它们用作参数来调用另一个函数order()order()是从模块restaurant.py导入的。

df_drinks中的行一起,我想向comment提交order(),这是在for循环之外指定的。

from restaurant import order

statement = "Lets order"
df_drinks = ["1 drink", "2 drink"] # simplified, 1 item per row, many columns

for index, row in df_drinks.iterrows():
    print ("%s, %s" % (statement, row))
    item = row
    response = order(statement, item)
    ...

该模块如下所示:

# restaurant.py

def order(statement, item):
    listen(statement)
    statement = "order received"
    ready_drinks = prepare(item)
    ...
    return ready_drinks

对于第一次运行/行,一切都很好,因为print产生:

让我们订购1杯饮品

但是,对于第二次运行/行,print会产生:

订单收到2杯饮料而不是让我们订购2杯饮品

我知道我有两个不同的变量名statement。尽管如此,我感到很困惑,因为order()中的restaurant.py只返回ready_drinks而不是statement

如何在python中正确地将局部变量分配给for循环?

3 个答案:

答案 0 :(得分:1)

陈述="收到订单"是一个局部变量和声明="让订单"是一个全局变量。你无法覆盖for循环中的值。可能低于代码可以帮助你

df_drinks = [" 1饮料"," 2饮料"] #simplified,每行1件,多列

for row in df_drinks:
    statement = "Lets order"
    print ("%s, %s" % (statement, row))
    item = row
    ready_drinks,statement = order(statement, item)
    print ("%s, %s" % (statement, row))


def order(statement, item):
    listen(statement)
    statement = "order received"
    ready_drinks = prepare(item)
    ...
    return ready_drinks,statement

答案 1 :(得分:0)

我不确定你要问的是什么,但如果我正确理解你所说的内容,那么看起来这可能是由于缩进造成的。所以代码变成了。

from restaurant import order

statement = "Lets order"
df_drinks = ["1 drink", "2 drink"] # simplified, 1 item per row, many columns

for index, row in df_drinks.iterrows():
    print ("%s, %s" % (statement, row))
    item = row
response = order(statement, item)

答案 2 :(得分:0)

非常感谢答案。我过度简化了。最初应该提到的是statement不是原始代码中的字符串,而是pandas df。根据我的理解,这导致了Pandas: Chained assignments 的问题。

在第一个代码的statement循环中的第一行之后,inplace = True数据框在restaurants.py中经历了多个for个处理步骤。这导致for循环的所有其他行中的上述更改。

如果其他人可能在将来遇到类似的问题,我想添加如何防止这种情况:为restaurants.py中的操作组创建一个单独的数据框副本,如上所述{{3} }。

statement2 = statement.copy(deep=False)