我有蟒蛇這個簡單的代碼,計算了一頓+稅+提示:爲什麼2個具有相同名稱的變量不會弄亂代碼?
meal = 44.50
tax = 0.0675
tip = 0.15
meal = meal + meal * tax
total = meal + meal * tip
print("%.2f" % total)
我想知道爲什麼沒有任何問題的代碼運行的時候,我們的確有2個變量名稱相同,但不同值?我提到的變量是1號線和5號線上的「餐」
有人請爲我澄清這一點嗎?
謝謝!
我有蟒蛇這個簡單的代碼,計算了一頓+稅+提示:爲什麼2個具有相同名稱的變量不會弄亂代碼?
meal = 44.50
tax = 0.0675
tip = 0.15
meal = meal + meal * tax
total = meal + meal * tip
print("%.2f" % total)
我想知道爲什麼沒有任何問題的代碼運行的時候,我們的確有2個變量名稱相同,但不同值?我提到的變量是1號線和5號線上的「餐」
有人請爲我澄清這一點嗎?
謝謝!
你沒有這兩個變量,則名meal
是可變的,它是可變的值(以下簡稱「指針」到一個整數對象,而不是整數對象本身)這是被覆蓋在第二meal = ...
聲明。
因此,您不再有權訪問第一個值。就變量名而言,您只能訪問第二個變量名。看到這個例子
>>> meal = 5 # first meal variable
>>> id(meal)
30126376
>>> meal = meal + 7 # second meal variable
>>> id(meal)
30126292
請注意,「2nd」meal
變量有一個新的ID。這是因爲它是一個新的int
,恰好有相同的名稱。以前的變量不再可用。
重新措詞「你沒有兩個變量,你不再有權訪問第一個」 - 嗯,概念上我會同樣它是相同的_variable_(即,名稱),它只是對象_behind_它已經改變(價值)。 – paxdiablo 2014-10-17 00:55:24
忍受我,我會做一個編輯,你可以看看你是否喜歡它。 – paxdiablo 2014-10-17 00:57:45
@paxdiablo:我真的不喜歡編輯版本中的「覆蓋」一詞。它聽起來像是有一些「內存插槽」(如C或C++中的變量),它包含一個整數,並且該插槽的內容已更新。但當然這不是發生了什麼;在全新的內存插槽中會創建一個完全獨立的整數值,並且該名稱只會反彈到新的值。 (答案的其餘部分說明了這一點,但我認爲它開始誤導,並且新手可能不會注意到它稍後會被糾正。) – abarnert 2014-10-17 01:16:20
我假設你的意思是meal
。請記住,最後完成分配 - 首先程序將meal + meal * tax
計算爲臨時變量,然後重新定義meal
以獲得該臨時變量的值。嘗試打印該行前後的值作爲示例。幕後的實際執行是這樣的:
temporary = meal + meal * tax
meal = temporary
#temporary is out of scope at this point
當值賦給meal
第二次(上線meal = meal + meal * tax
)的44.50
的前值被覆蓋 - 你沒有辦法訪問值44.50
了。因此,在這段特定的代碼段中,不會有兩個同時存在的meal
對象。
您可以覆蓋並重用Python中沒有問題的變量。在其他一些語言中,您不能重新聲明變量。 – 101 2014-10-17 00:51:38
您沒有兩個具有相同名稱的變量。您正在爲該變量重新分配一個新值。 – 5gon12eder 2014-10-17 00:51:39
我很好奇你的背景是什麼。有些語言只允許名稱綁定一次(或者對初始綁定和重新綁定使用不同的語法),但沒有任何「主流」語言以這種方式工作。這是你從數學帶來的直覺嗎?如果是這樣,你就像ML或Haskell程序員一樣思考,這是你可以吹噓的東西。 :) – abarnert 2014-10-17 01:20:00