2011-05-13 64 views
1

請看看下面:爲什麼我可以在python中亂序寫一些東西,而不是其他的?

a = 5 
print a + b 
b = 4 

當我試圖運行上面的代碼,它給出了一個錯誤: 回溯(最近通話最後一個): 文件「C:/用戶/用戶/文件/ modules/ab.py「,第2行,在 print a + b NameError:name'b'is not defined

好的。在定義b之前調用a + b。這意味着Python按順序運行代碼,從上到下開始。 但是,這個怎麼樣:

class Data: 
    def __init__(self): 
     self.debug_level = 9 
     self.assign = [0, 0, 0, 0] 
     self.days = 0 
    def create_days(self, startTime, endTime): 

     res = 0 
     try: 
      if self.final_days < self.maximum_days: 

以上,self.final_daysself.maximum_days尚未定義要麼,但它不會給任何錯誤。它背後的邏輯是什麼?

最好的問候,

+1

您是否理解「定義」與「評估」之間的區別?你能先看看那些,然後**更新**你的問題來解釋你的困惑是什麼。 – 2011-05-13 09:58:39

+0

您需要先撥打電話。 – riza 2011-05-13 12:50:54

+0

運行'create_days'時,它們將被定義。 – tzot 2011-05-13 20:26:59

回答

4

因爲被定義的類時不被訪問的屬性它不給任何錯誤。只要您撥打create_days(),您就會遇到問題:D

2

函數的主體僅在調用時評估,而不是在定義時評估。

1

引用僅在代碼運行時查找。您可以在create_days()方法中添加您喜歡的任何名稱,並且在執行包含它們的行之前不會檢查任何名稱。

+0

那意味着self.final_days和self.maximum_days在調用create_days()之前應該有一個值? – alwbtc 2011-05-13 08:47:59

+1

是的。否則它是沒有意義的。 – Joe 2011-05-13 08:52:10

5

你實際上並沒有「運行」代碼。在你的例子中,你擁有的只是Data類中的一個方法聲明。在這個例子中,Python不會檢查類字段的存在,因爲它們可能在另一個時間被設置,在其他方法中(Python的類在這個意義上是可延展的)。

如果您嘗試在Data類的新實例中運行create_days方法而未事先設置這些字段的值,則會出現錯誤。

1

如果實際執行它,你會得到 AttributeError的:數據實例沒有屬性 'final_days'

要重現此:

x = Data() 
x.create_days(1,2) 

也,你有一個try塊。我認爲這是一些其他代碼的摘錄。 try塊可能吞嚥了異常。

0

Python是一種解釋型語言,與C++不同,它不會被編譯,因此函數的主體在調用之前不會被評估。

相關問題