【问题标题】:What happens internally when we assign a function to a name?当我们将函数分配给名称时,内部会发生什么?
【发布时间】:2018-11-25 21:07:35
【问题描述】:
def x():
    print("This is a function x")

我定义了一个名为x的函数并将其分配给y

y = x
y() # Calling this would call the original function

但是内部发生了什么,它是分配一个指针或对函数的引用还是我无法理解的类似实例的东西? 或者它是否给出了定义x的内存地址的链接?

【问题讨论】:

  • 一个函数被创建并绑定到一个名称 (x),然后名称 y 绑定到与 x 相同的东西(在这种情况下,您的函数)。该函数对象将一直存在,直到没有对其的引用,此时它将被垃圾回收。
  • 是的,在内部 y 是一个名称绑定到名称 x 绑定到的同一指针。但最好不要考虑 Python 中的指针。相反,尝试以自己的方式接受 Python 数据模型。您可能会发现这篇文章很有帮助:Facts and myths about Python names and values,由 SO 资深人士 Ned Batchelder 撰写。
  • 您可能对dis 模块感兴趣。值得注意的是,这在全局范围(其中变量是来自当前globals dict 的名称)与在函数范围(其中变量只是堆栈帧的索引)中的作用完全不同。而且我认为仍然存在使用后备的情况......
  • @PM2Ring 在课程视频中,我定义了函数 x 并将 y 分配给 x 稍后 x 被 del x 删除并由 x() 调用,然后解释器说 x 是未定义然后函数 y 由 y() 调用但它被执行。那么是否可以删除函数x的引用,如果是,那么如果x被删除或者它只是一个被删除的对象而不是存储在内存中的程序,那么y如何调用该函数

标签: python function python-internals


【解决方案1】:

因为在 python 中一切都是对象(甚至函数都是第一类对象)所以,当你定义一个函数'x'并将它分配给变量(名称)'y'时,它只不过是将名称绑定到对象'x'。 对于这句话,

y=x()

名称 y 绑定到函数 x 的范围。所以,

y() 

绑定到 x 的函数调用。

【讨论】:

    【解决方案2】:

    通过将函数分配给变量:

    y = x
    

    x()的对象的引用保存在变量y

    当您通过以下方式将分配的变量作为函数调用时:

    y()
    

    这通过使用存储的引用调用函数x

    【讨论】:

    • 因此,如果我有函数 def x(self,name): self.name = name 并且当我分配 y 时,任何具有函数 x 引用的变量实际上都可以执行 x 可以执行的操作= x 它也可以将数据存储在 x 中吗?
    • 是的,任何具有引用的变量都执行 x 所做的工作 @YouKnowWhoIAm ,因为您将函数 x 的引用存储在变量中,因此将变量作为函数调用,通过其引用调用 x() 。
    • @YouKnowWhoIAm 如果 x 是一个具有两个输入参数的函数,即:x(var_a, var_b) 和 y = x,那么如果作为函数调用,则 y 就像 x 一样接受两个输入参数
    • 函数持有的数据也会被复制到y中还是函数的新副本
    • @YouKnowWhoIAm,您能否澄清一下:“函数持有的数据”。
    【解决方案3】:

    与(几乎)所有其他编程语言一样,函数是对象

    def x(): 
        print("This is a function x")
    

    x 现在是函数类型的对象

    y = x 
    y() # Calling this would call the original
    

    所以在 y 变量中存储了一个指向 x 对象/函数的指针。如果你调用 y(),y 会查找它的 'origin' 并调用 x...

    因为所有函数都是对象,所以你也可以将函数作为参数传递:

    def test(func):
        func()
    
    test(x)
    

    会输出:

    这是一个函数x

    希望我能帮上忙!

    【讨论】:

    • 在课程视频中,我定义了函数 x,然后将 y 分配给 x,x 被 del x 删除并由 x() 调用,然后解释器说 x 未定义然后函数 y 由 y() 调用但它被执行。那么是否可以删除函数x的引用,如果是,那么如果x被删除或者它只是一个被删除的对象而不是存储在内存中的程序,那么y如何调用该函数
    • 如果你想删除对 x 函数的 y 引用,你可以说 y = 0 或类似的东西......而且你不能只删除一个函数......你只能让对不存在的函数的引用...就像在定义 x 之前说 y=x...希望我能帮上忙!
    • 但是在教程中那个人删除了这个函数,我知道一个函数不能被删除,但我认为可能在 python 中我们可以做到。也有人说是的,说 x 只是一个参考,所以是的,我们可以删除 x。
    【解决方案4】:

    函数是对象,就像 Python 中的其他一切一样。将函数分配给名称就像分配字符串或列表一样 - 与这些相同,会创建对对象的新引用。

    【讨论】:

    • 因此,如果我添加对它的引用,然后删除原始函数名称,那么第二个引用是否符合该函数
    • 是的,因为 both 名称只是参考。原来的名字没有什么不同;删除它不会删除函数,它只是删除对它的引用。当不再引用对象时,Python 将在内部删除对象。
    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2021-07-23
    • 2014-12-20
    相关资源
    最近更新 更多