gpt4 book ai didi

python - python解释器如何处理具有默认参数的函数定义的位置

转载 作者:行者123 更新时间:2023-12-03 15:00:26 25 4
gpt4 key购买 nike

为什么 第一个代码输出 51 第二个代码输出 21 .我理解第二个代码应该输出 21,但是按照我的理解,第一个代码也应该输出 21(b 的值变为 20,然后调用函数 f)。我错过了什么?

b = 50

def f(a, b=b):
return a + b

b = 20
print(f(1))

输出:51
b = 50
b = 20

def f(a, b=b):
return a + b
print(f(1))

输出:21

编辑:这与 How to change default value of optional function parameter in Python 2.7? 不同因为这里讨论的是默认参数发生的无意更改,而不是如何有意更改默认参数的值,即这里的问题集中在python解释器如何处理具有默认参数的函数的函数定义位置。

最佳答案

python初学者提示 :如果您使用 IDE,例如 pycharm - 您可以放置​​一个调试器并查看变量发生了什么。

我们可以使用 id(b) 更好地了解正在发生的事情。它为我们提供了内存中特定对象的地址:

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.



让我将您的代码修改为以下内容:
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))

输出如下:
b=50 : 4528710960
b=20 : 4528710000
b in the function f : 4528710960
4528710960
51

如您所见 b在函数内部和 b=50有相同的地址。

当你这样做 b=20创建了一个新对象。

在 Python 中,(几乎)一切都是对象。我们通常在 Python 中称为“变量”的东西更恰本地称为名称。同样,“赋值”实际上是将名称绑定(bind)到对象。 每个绑定(bind)都有一个定义其可见性的范围,通常是名称所在的 block 。

在 python

当你这样做
b=50一个 binding b 中创建一个 int 对象区 block 范围

当我们稍后说 b=20 int 对象 b=50不受影响。这两者本质上是两个不同的对象。

您可以在这些链接中阅读有关它的更多信息。
  • Is Python call-by-value or call-by-reference? Neither.
  • Parameter Passing
  • Python id()
  • 关于python - python解释器如何处理具有默认参数的函数定义的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61723421/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com