为什么我的代码会打印一个我尚未分配的值?

时间:2019-08-17 09:59:27

标签: python

我正在学习python,我对函数的运行方式有些困惑。
我声明了一个函数,但直到几行后才给该函数赋值,但是,我之前曾要求过该值。 据我了解,python逐行运行代码,类似于c,那么为什么它仍给出值?抱歉,如果我提出的问题有点令人困惑,我已包含我的代码,这样您就可以看到我要提出的问题。 如您所见,我在第2行和第3行中要求一个值,但是我在第7行中声明了这些值。为什么第2-3行给出我声明的值?

def cheese_and_crackers(cheese_count, box_of_crackers):
    print(f"You have {cheese_count} cheeses!")
    print(f"You have {box_of_crackers} boxes of crackers")
    print("Man that's enough for a party!")
    print("Get a blanket \n")

print("We can just give the function numbers directly")
cheese_and_crackers(20, 32)

print("OR, we can use variables from our script")
amount_of_cheese = 10
amount_of_crackers = 32

cheese_and_crackers(amount_of_cheese, amount_of_crackers)

1 个答案:

答案 0 :(得分:2)

Python程序中的行可以按照与它们在程序中的位置不同的顺序执行。当“执行”一行时会发生什么,可能与您预期的有所不同。鉴于此,让我们在执行程序时看一下它,而忽略了一些更好的地方。您可以通过在调试器中一次运行该程序(一个独立的程序或包含在您的IDE中的一个程序,例如Spyder或Visual Studio Code)来了解我的解释。

在开始执行之前,将代码“编译”为易于计算机处理的版本。然后执行从第1行开始。

您的第1行是def语句。执行此行不会执行该功能。取而代之的是,将函数的代码行放入内存中,并将函数名(在您的情况下为cheese_and_crackers)赋予该行集合。然后,将跳过函数内的行,并从函数后的行继续执行(在您的情况下为第6行)。如果运行调试器,您将看到执行从第1行跳到第6行。

第6行很简单:将一些文本打印到标准输出中。

第7行看到名称cheese_and_crackers,后跟左括号,因此Python知道(最终)执行先前在第1行中定义的函数。Python计算参数20和{{1 }},将它们分配给名称32cheese_count,请注意,这些名称是用于函数内部的,我将跳过其他一些事情,然后转到第2行。

第2行看到它需要名称box_of_crackers的值,并查看该名称是否存在于函数中。确实如此-在第7行中分配了cheese_count-以便使用该值。

第3行到第5行的处理类似。

在第5行结束时,Python看到函数已完成。为此功能执行创建的名称20cheese_count被销毁,其值被标记为可能销毁。然后在调用该函数的行之后恢复执行。

第8行很简单。

第9行和第10行定义了新变量。计算这些值,将其存储在内存中,并指定名称box_of_crackersamount_of_cheese。由于这些行不在函数内,因此这些名称被标记为“全局”。

第11行类似于第7行,因此将计算参数值并将其存储在变量amount_of_crackerscheese_count中。

再次执行第2至5行,但使用名称的 current 值。

完成后,执行将恢复到第11行之后。由于第11行之后没有任何内容,因此程序结束。

很清楚吗? 总而言之,您可以正确地理解“ Python逐行运行代码”,但并不总是按照自上而下的顺序进行。特别是,第2行和第3行在 行之后执行,然后在9-11行之后再次执行。