Python 为什么内置名称会更改其他名称的绑定?

Python 为什么内置名称会更改其他名称的绑定?,python,Python,我认为Python中的名称是绑定到对象的。如果是这种情况,则会有一个可用的对象,并且至少有两个名称绑定到该对象上,“open”和“builtins.open”。 更改一个名称的绑定不应更改对象或其他名称。 令人惊讶的是,当我运行以下命令时,builtins.open=0也会更改open的绑定: >>> import builtins >>> builtins.open=0 >>> open 0 为什么会发生这种情况? 在另一个主题中,我看到

我认为Python中的名称是绑定到对象的。如果是这种情况,则会有一个可用的对象
,并且至少有两个名称绑定到该对象上,“
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>
>a=zip
>>>a
>>>b->a#用什么方法指向一个名字?
>>>b=all#这实际上是在改变a的绑定
>>>b
>>>a
如果仔细想想,这正是第一个例子中内置的
open
open
所发生的情况,因为某些原因,它们是相同的名称


这可以用于在Python中实现类似指针的行为吗?如何操作?

这里涉及到一个绑定,
内置。打开
。在当前全局命名空间中,
open
没有绑定;裸
open
的名称解析成功,因为在globals中找不到
open
的绑定后,Python尝试
内置。open
并找到它


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

这里涉及一个绑定,
内置。打开。在当前全局命名空间中,
open
没有绑定;裸
open
的名称解析成功,因为在globals中找不到
open
的绑定后,Python尝试
内置。open
并找到它


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

Python中的每个名称都是对对象的引用。如果你想玩指针游戏,可以使用专门的语言,比如C.@TigerhawkT3 Yes。我也使用指针语言。这次我只是探索Python语言的边界。Python中的每个名称都是对对象的引用。如果你想玩指针游戏,可以使用专门的语言,比如C.@TigerhawkT3 Yes。我也使用指针语言。这次我只是在探索Python语言的边界,这完全可以解释问题。我想我的问题是:如果全局和内置失败,我可以添加更多的名称空间进行搜索吗?@AndresR:no。即使是像
import*
这样的东西也不会这样做,而且有一个非常有力的例子,就是
import*
应该被设计为这样做。这完全解释了问题。我想我的问题是:如果全局和内置失败,我可以添加更多的名称空间进行搜索吗?@AndresR:no。即使是像
import*
这样的东西也不能这样做,而且有一个非常有力的例子,就是
import*
应该设计成这样。