Python 3.x Python中作为对象的函数范围

Python 3.x Python中作为对象的函数范围,python-3.x,function,scope,Python 3.x,Function,Scope,我试图理解python如何将其函数作为对象存储和访问。 以下面的代码为例- def make_pretty(func): def inner(): print("I got decorated") func() return func return inner def ordinary(): print("I am ordinary 2") ordinary() pretty=make_pretty(ordinary)

我试图理解python如何将其函数作为对象存储和访问。 以下面的代码为例-

def make_pretty(func):
    def inner():
        print("I got decorated")
        func()
        return func
    return inner

def ordinary():
    print("I am ordinary 2")

ordinary()
pretty=make_pretty(ordinary)

pretty()
执行时,pretty()返回

我仍然得到与以前相同的输出,即使我更改了普通的全局定义,也就是说,尽管我重新定义了普通,并且在pretty中func是指全局普通,但pretty仍然在考虑以前的普通定义

为什么会这样?我在某个地方显然错了,但我不知道在哪里。 如能提供一些见解,将不胜感激。谢谢

尽管我改变了普通人的全球定义, i、 e.pretty仍在考虑之前对普通的定义 尽管我已经重新定义了“普通”和“漂亮”中的函数 指全球普通股

您没有更改
pretty
引用的函数对象。您创建了一个新函数,并将其命名为
normal
。原始函数仍然存在,但不能再以名称
普通
引用

pretty
不知道这一切。它始终是指原始功能

之前 名称“普通”和函数
pretty
均指相同的函数:


您应该阅读更多关于python中对象引用的内容。我从中了解到了对象引用,根据我在本例中的理解,普通对象在被更改之前一直被引用调用,当它被更改时,它就变成了值调用。这是正确的吗?是的,在使用id函数之后,我明白了,无论如何,谢谢
I got decorated
I am ordinary 2
<function __main__.ordinary()>
def ordinary():
    print("I am ordinary 3")

pretty()