繁体   English   中英

python 解释器如何处理具有默认参数的 function 定义的 position

[英]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 中的bb=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM