2014-10-17 88 views
0

我有蟒蛇這個簡單的代碼,計算了一頓+稅+提示:爲什麼2個具有相同名稱的變量不會弄亂代碼?

meal = 44.50 
tax = 0.0675 
tip = 0.15 

meal = meal + meal * tax 
total = meal + meal * tip 

print("%.2f" % total) 

我想知道爲什麼沒有任何問題的代碼運行的時候,我們的確有2個變量名稱相同,但不同值?我提到的變量是1號線和5號線上的「餐」

有人請爲我澄清這一點嗎?

謝謝!

+0

您可以覆蓋並重用Python中沒有問題的變量。在其他一些語言中,您不能重新聲明變量。 – 101 2014-10-17 00:51:38

+4

您沒有兩個具有相同名稱的變量。您正在爲該變量重新分配一個新值。 – 5gon12eder 2014-10-17 00:51:39

+0

我很好奇你的背景是什麼。有些語言只允許名稱綁定一次(或者對初始綁定和重新綁定使用不同的語法),但沒有任何「主流」語言以這種方式工作。這是你從數學帶來的直覺嗎?如果是這樣,你就像ML或Haskell程序員一樣思考,這是你可以吹噓的東西。 :) – abarnert 2014-10-17 01:20:00

回答

7

你沒有這兩個變量,則meal是可變的,它是可變的(以下簡稱「指針」到一個整數對象,而不是整數對象本身)這是被覆蓋在第二meal = ...聲明。

因此,您不再有權訪問第一個值。就變量名而言,您只能訪問第二個變量名。看到這個例子

>>> meal = 5 # first meal variable 
>>> id(meal) 
30126376 

>>> meal = meal + 7 # second meal variable 
>>> id(meal) 
30126292 

請注意,「2nd」meal變量有一個新的ID。這是因爲它是一個新的int,恰好有相同的名稱。以前的變量不再可用。

+0

重新措詞「你沒有兩個變量,你不再有權訪問第一個」 - 嗯,概念上我會同樣它是相同的_variable_(即,名稱),它只是對象_behind_它已經改變(價值)。 – paxdiablo 2014-10-17 00:55:24

+1

忍受我,我會做一個編輯,你可以看看你是否喜歡它。 – paxdiablo 2014-10-17 00:57:45

+0

@paxdiablo:我真的不喜歡編輯版本中的「覆蓋」一詞。它聽起來像是有一些「內存插槽」(如C或C++中的變量),它包含一個整數,並且該插槽的內容已更新。但當然這不是發生了什麼;在全新的內存插槽中會創建一個完全獨立的整數值,並且該名稱只會反彈到新的值。 (答案的其餘部分說明了這一點,但我認爲它開始誤導,並且新手可能不會注意到它稍後會被糾正。) – abarnert 2014-10-17 01:16:20

0

我假設你的意思是meal。請記住,最後完成分配 - 首先程序將meal + meal * tax計算爲臨時變量,然後重新定義meal以獲得該臨時變量的值。嘗試打印該行前後的值作爲示例。幕後的實際執行是這樣的:

temporary = meal + meal * tax 
meal = temporary 
#temporary is out of scope at this point 
0

當值賦給meal第二次(上線meal = meal + meal * tax)的44.50的前值被覆蓋 - 你沒有辦法訪問值44.50了。因此,在這段特定的代碼段中,不會有兩個同時存在的meal對象。

相關問題