簡體   English   中英

為什么我的代碼會打印一個我尚未分配的值?

[英]Why does my code print a value that I have not assigned as yet?

我正在學習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)

Python程序中的行可以按照與它們在程序中的位置不同的順序執行。 當“執行”一行時會發生什么,可能與您預期的有所不同。 鑒於此,讓我們在執行程序時看一下它,而忽略了一些更好的地方。 您可以通過在調試器中一次運行該程序(一個獨立的程序或包含在您的IDE中的一個程序,例如Spyder或Visual Studio Code)來查看我的解釋。

在執行開始之前,將代碼“編譯”為易於計算機處理的版本。 然后從第一行開始執行。

您的第1行是def語句。 執行此行不會執行該功能 取而代之的是,將函數的代碼行放置到內存中,並將函數名(在您的情況下為cheese_and_crackers )賦予該行集合。 然后,將跳過函數內的行,並從函數后的行繼續執行(在您的情況下為第6行)。 如果運行調試器,您將看到執行從第1行跳到第6行。

第6行很簡單:一些文本被打印到標准輸出中。

第7行看到名稱cheese_and_crackers左括號,因此Python知道(最終)執行先前在第1行中定義的函數。Python計算參數2032 ,將它們分配給名稱cheese_countbox_of_crackers ,請注意,名稱是函數的內部內容,我將跳過一些其他事情,然后轉到第2行。

第2行看到它需要name cheese_count的值,並看該名稱是否存在於函數中。 它確實在第7行中被分配了20 ,因此使用了該值。

第3至5行的處理類似。

在第5行結束時,Python看到函數已完成。 為此函數執行而創建的名稱,即cheese_countbox_of_crackers ,將被銷毀,並標記其值以進行可能的銷毀。 然后,在調用該函數的行之后恢復執行。

第8行很簡單。

第9和10行定義了新變量。 計算這些值,將其存儲在內存中,並amount_of_cheese指定名稱amount_of_cheeseamount_of_crackers 由於這些行不在函數內,因此這些名稱被標記為“全局”。

第11行與第7行類似,因此將計算參數值並將其存儲在變量cheese_countbox_of_crackers

(再次)執行第2至5行,但使用名稱的當前值。

完成后,執行將恢復到第11行之后。由於第11行之后沒有任何內容,因此程序結束。

清楚了嗎? 總之,您正確地認為“ Python逐行運行代碼”,但並不總是按照從上到下的順序進行。 特別是,第2行和第3行在第7行之后執行然后在第9-11行之后再次執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM