Python 为什么两个同名的变量不';别把密码弄乱了?

Python 为什么两个同名的变量不';别把密码弄乱了?,python,Python,我用python编写了以下简单代码,用于计算餐费+税金+小费: meal = 44.50 tax = 0.0675 tip = 0.15 meal = meal + meal * tax total = meal + meal * tip print("%.2f" % total) 我想知道,当我们显然有两个同名但值不同的变量时,为什么代码运行时没有任何问题?我指的变量是第1行和第5行的“吃饭” 有人能帮我澄清一下吗 谢谢 您没有两个变量,名称fine是变量,在第二个fine=…语句中覆盖

我用python编写了以下简单代码,用于计算餐费+税金+小费:

meal = 44.50
tax = 0.0675
tip = 0.15

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

print("%.2f" % total)
我想知道,当我们显然有两个同名但值不同的变量时,为什么代码运行时没有任何问题?我指的变量是第1行和第5行的“吃饭”

有人能帮我澄清一下吗


谢谢

您没有两个变量,名称
fine
是变量,在第二个
fine=…
语句中覆盖的是该变量的值(指向整数对象的“指针”,而不是整数对象本身)

因此,您不再有权访问第一个值。就变量名而言,您只能访问第二个变量名。看这个例子

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

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

请注意,“第二个”
fine
变量有一个新的ID。这是因为它是一个新的
int
,恰好具有相同的名称。上一个变量不再可访问。

我猜您的意思是
用餐
。请记住,作业是最后完成的-首先,程序将
膳食+膳食*税
计算为临时变量,然后重新定义
膳食
以获得该临时变量的值。尝试打印该行前后的值作为插图。幕后的实际执行情况如下所示:

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

当您第二次为
餐食
赋值时(在
餐食=餐食+餐食*税
行上),先前的
44.50
值将被覆盖-您无法再访问该值
44.50
。因此,在这个特定的代码片段中,永远不会同时存在两个
对象。

在Python中,您可以毫无问题地覆盖和重用变量。在其他一些语言中,你不能重新声明变量。你没有两个同名的变量。您正在为变量重新赋值。我很好奇您的背景是什么。有些语言只允许名称绑定一次(或者在初始绑定和重新绑定时使用不同的语法),但没有一种“主流”语言是这样工作的。这是你从数学中得到的直觉吗?如果是这样的话,你的想法就像一个ML或Haskell程序员,这是你可以吹嘘的“你没有两个变量,你不再有权访问第一个变量”-嗯,从概念上讲,我会说它是同一个变量(即名称),只是它背后的对象发生了变化(值)。请放心,我会进行编辑,你可以看看你喜不喜欢。@paxdiablo:我真的不喜欢“覆盖”这个词在编辑版本中。这听起来像是有一个“内存槽”(像C或C++中的变量)保存一个整数,并且该槽的内容已经更新。但事实并非如此;在一个全新的内存插槽中创建了一个完全独立的整数值,而这个名称正好反弹到这个新值。(答案的其余部分说明了这一点,但我认为这一点一开始就有误导性,新手可能不会注意到以后正在更正。)请更正您的解释。如果说前面的变量不再可访问,这是不正确的。尝试重新分配MEIN=5和id(MEIN),它可能会显示存储在内存中的前一个id。MEIN只是一个分配给integer对象5的名称,然后创建了另一个integer对象,并根据第一条注释指向mealI's corected,但我认为开始讨论未绑定对象的生命可能有点太深入Python内部。考虑到问题的初级水平,我怀疑这是个坏主意。