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

How to correctly assign local variables to a for-loop in python?

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

连同 df_drinks 中的行,我想提交一个 commentorder(),它在 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

对于第一个 run/row 一切都很好,因为 print 产生:

让我们点 1 杯饮料

然而,对于第二个 run/row,print 产生:

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

我知道我对两个不同的事物使用相同的变量名 statement。尽管如此,我还是很困惑,因为 restaurant.py 中的 order() 只做 return ready_drinks 而不是 statement.

如何正确地将局部变量分配给 python 中的 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)

statement="order received"是局部变量,statement="Lets order"是全局变量。您无法覆盖 for 循环中的值。可能下面的代码对你有帮助

df_drinks = ["1 drink", "2 drink"] # 简化,每行 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

非常感谢您的回答。我过度简化了。最初应该提到的是 statement 在原始代码中不是字符串,而是 pandas df。据我了解,这导致了有关 Pandas 的问题:链式赋值

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

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

statement2 = statement.copy(deep=False)