2017-08-24 114 views
1

我有一个for -loop,它在熊猫数据框df_drinks内取行,并将它们用作参数来调用另一个函数order()order()从模块restaurant.py导入。如何正确地将本地变量分配给python中的for-loop?

df_drinks中的行一起,我想提交一个commentorder(),它在for-loop之外指定。

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-loop?

+1

没有更多的细节很难帮助。你所显示的内容不能改变for循环中的'statement'。 – AChampion

+0

你是否想把'order'赋给调用者的'statement'变量? Python不能这样工作。它可能有助于阅读[快速解释Python变量如何工作](https://nedbatchelder.com/text/names.html)。 – user2357112

+0

请提供[mcve] –

回答

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) 
0

statement =“order received”是一个局部变量,statement =“Lets order”是一个全局变量。您不重写for循环中的值。可能是下面的代码可以帮助你

df_drinks = “喝1”, “2饮”]#简化,每行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 
0

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

statement数据帧在第一个代码的for循环中的第一行之后经过restaurants.py中的几个inplace = True处理步骤。这导致for循环的所有其他行中的上述变化。

如果别人以后可能遇到类似问题,我想添加如何防止这种情况:为restaurants.py中的操作组创建一个单独的数据框副本,如here所述。

statement2 = statement.copy(deep=False) 
相关问题