为什么builtins中的名称会更改其他名称的绑定?

时间:2017-03-27 21:44:52

标签: python

我认为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.openopen的第一个示例所发生的事情,由于某种原因,它们的名称相同。

这可以用于在Python中实现类似指针的行为吗?怎么样?

1 个答案:

答案 0 :(得分:2)

这里涉及一个绑定,builtins.open。您当前的全局命名空间中没有绑定open;裸open的名称解析成功,因为在未能在全局变量中找到open的绑定后,Python会尝试builtins.open并找到它。

这不能用于实现指针或类似指针的行为。