我认为Python中的名字绑定到了对象。如果是这种情况,则会有一个对象<built-in function open>
可用,并且至少有两个名称绑定到它,“open
”和“builtins.open
”。
更改一个名称的绑定不应更改对象和其他名称。
令人惊讶的是,当我运行以下内容时,builtins.open=0
也会更改open
:
>>> import builtins
>>> builtins.open=0
>>> open
0
为什么会这样?
关于另一个话题,我已经看到几个问题,询问如何在Python中实现指针名称,这样一个名称将指向到另一个名称(而不是绑定到另一个名称的绑定对象)并且可以通过使用第二个来改变名字的绑定。例如,如果->
运算符被定义为绑定指针:
>>> a = zip
>>> a
<class 'zip'>
>>> b -> a # some way to point to a name?
>>> b = all # this actually is changing the binding of a
>>> b
<built-in function all>
>>> a
<built-in function all>
如果您仔细想想,这正是builtins.open
和open
的第一个示例所发生的事情,由于某种原因,它们的名称相同。
这可以用于在Python中实现类似指针的行为吗?怎么样?
答案 0 :(得分:2)
这里涉及一个绑定,builtins.open
。您当前的全局命名空间中没有绑定open
;裸open
的名称解析成功,因为在未能在全局变量中找到open
的绑定后,Python会尝试builtins.open
并找到它。
这不能用于实现指针或类似指针的行为。