我有一个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循环?
答案 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)