[英]how python interpreter treats the position of the function definition having default parameter
为什么第一个代码输出51 ,第二个代码输出21 。 我理解第二个代码应该是output 21,但是按照我的理解,第一个代码应该也是output 21(b的值变成20然后是调用ZC1C425268E68385D1AB5074FC)。 我错过了什么?
b = 50
def f(a, b=b):
return a + b
b = 20
print(f(1))
Output:51
b = 50
b = 20
def f(a, b=b):
return a + b
print(f(1))
Output:21
编辑:这与如何在 Python 2.7 中更改可选 function 参数的默认值不同? 因为这里讨论的是对默认参数的无意更改,而不是如何有意更改默认参数的值,即这里的问题集中在 python 解释器如何处理 ZC1C425268E68385D1AB5074F 的 position 定义具有默认参数的函数的 position。
python 初学者的提示:如果您使用像 pycharm 这样的 IDE - 您可以放置一个调试器并查看变量发生了什么。
我们可以使用id(b)
更好地理解发生了什么,它为我们提供了 memory 中特定 object 的地址:
返回 object 的“身份”。 这是一个 integer,保证在此 object 在其生命周期内是唯一且恒定的。 具有非重叠生命周期的两个对象可能具有相同的id()值。
CPython实现细节:这是memory中object的地址。
让我将您的代码修改为以下内容:
b = 50
print("b=50 :", id(b))
def f(a, b=b):
print("b in the function f :", id(b))
print(id(b))
return a + b
b = 20
print("b=20 :", id(b))
print(f(1))
output如下:
b=50 : 4528710960
b=20 : 4528710000
b in the function f : 4528710960
4528710960
51
如您所见,function 中的b
和b=50
具有相同的地址。
当您执行b=20
时,会创建一个新的 object。
在 Python 中,(几乎)一切都是 object。 我们在 Python 中通常所说的“变量”更恰当地称为名称。 同样,“赋值”实际上是将名称绑定到 object。 每个绑定都有一个 scope 定义其可见性,通常是名称起源的块。
在 python
当你这样做
b=50
a binding
b到 int object在块的 scope中创建
当我们稍后说b=20
时, int object b=50
不受影响。 这两者本质上是两个不同的对象。
您可以在这些链接中阅读有关它的更多信息。
想想口译员是如何处理这个问题的。 在第一种情况下, def f(a, b=b)
被解释为def f(a, b=50)
因为当前 scope 中b
的值为50
。 因此, f(1)
将a
分配给1
,因此a + b
= 1 + 50 = 51 。
同样,在第二种情况下,当前 scope 中b
的值在声明 function 时为 20,因此定义解释为def f(a, b=20)
。 因此, f(1)
= 21 。
function 的不同放置导致不同错误的原因也是因为值“b”的放置。
由于 function 'f' 使用命名参数 'b',因此它将变量 'b' 作为参数/参数的第一个赋值给 function 'f'
例如,
b = 50
def f(a, b=b):
return a + b
b = 20
print(f(1))
正如您所指出的,这导致 output 51
但是,如果我将代码更改为
def f(a, b=b):
return a + b
b = 50
b = 20
print(f(1))
这将导致以下错误:
def f(a, b=b):
NameError: name 'b' is not defined
因此,我们可以推断出作为 function 的命名参数的变量的放置导致了输出的差异。
您也可以使用全局变量。
因为当您在案例 1 中定义 function f
时,您正在将b
的值(当时为50
)分配给 function 的第二个参数。
而在情况 2 中,在将b
的值分配给f
的第二个参数时,它是20
。
这就是两种情况下答案不同的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.