当前位置: 首页 > 面试题库 >

为什么要在Python中为内置函数分配值?

李博达
2023-03-14
问题内容

今天,当我发现一段Python代码使用内置函数
all作为变量标识符来存储列表推导的结果并且没有引发错误时,我偶然发现了这一点,因此我尝试了以下操作:

type('abc')
Out[1]: str

type('abc') == str
Out[2]: True

str = int

type('abc') == str
Out[4]: False

type('abc')
Out[5]: str

type = [1,2,3]

type('abc')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-a74a7df76db1> in <module>()
----> 1 type('abc')

TypeError: 'list' object is not callable

希望当我问为什么在Python中允许这种行为时,这是一个有效的问题。

或者更好的是,如何确保内置函数str的确是真实的str而不是不说,int因此str(123)不会被int(123)偶然评估?


问题答案:

Python希望您对您的代码负责,这就是为什么。Python没有私有属性,没有受保护的类,并且几乎没有关于可以使用的名称的限制。

是的,这意味着您可能会意外重命名内置文件。为代码创建单元测试,使用lint,通常,您将很快学会发现意外使用所需的内置组件。这与意外地在代码中重用其他名称没有什么不同。

请注意,您只是 掩盖
了内置名称。找不到全局下一个名称的查找将在内置名称空间中进行,因此,如果您设置str其他名称,则会在内置名称空间之前找到。只需删除全局:

>>> str = 'foobar'
>>> isinstance('foobar', str)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
>>> del str
>>> isinstance('foobar', str)
True

另一种选择是使每个内置名称成为保留关键字,从而使您可以使用的名称列表大大减少,并且在重新定义这些对象时没有灵活性。例如,Python
2.7有144个这样的名称。

在这种情况下,请参阅Guido van Rossum撰写的博客文章,内容为为什么NoneTrue并且False现在是Python
3中的关键字:

因为您永远无法在任何Python程序中的任何地方将它们用作变量名或函数名,所以使用Python的每个人都必须了解该语言中的所有保留字,即使它们不需要它们。因此,我们尝试使保留字的列表保持较小,并且核心开发人员在向该语言添加新的保留字之前会费力工作。



 类似资料:
  • 问题内容: 我为什么可以这样做: 但是我不能这样做: 这两个函数都破坏了this的值并将其更改为,但是第二个函数抛出以下错误: 我怀疑这是因为允许分配意味着我可以将数组更改为其他内容(例如字符串),但是我希望那里的人可以肯定并且/或者有更详细的解释。 问题答案: 不允许在函数内分配值。假设您 可以 执行此操作,并且您的代码如下所示: 现在,如果您这样做: 在对象上调用函数的行为不应更改对象的 身份

  • 在我的Java项目中,我使用Lombok工具生成getter和setter<它与Maven完美配合,无需任何配置。 为什么我需要为龙目岛配置Eclipse<我已经知道如何配置Eclipse:https://projectlombok.org/download.html 为什么我必须在我的eclipse.ini中添加以下行?

  • 本文向大家介绍为什么要用纯函数?相关面试题,主要包含被问及为什么要用纯函数?时的应答技巧和注意事项,需要的朋友参考一下 在此之前要先了解什么是纯函数,简单来说纯函数的定义有两个: 1.返回的结果只依赖于传入的参数。 2.执行过程中不产生副作用。 在这里就需要了解到什么是副作用 1.改变了外部变量或者对象属性 2.触发任何外部进程 3.发送http请求 4.调用其他有副作用的函数 5.…… 那么我们

  • 因此,该资源(http://www . IBM . com/developer works/Java/library/j-jtp 05236/index . html)建议,当线程本身不处理中断时,在线程中设置中断位,“以便调用堆栈中更高层的代码可以了解到中断,并在需要时做出响应。” 假设我正在使用执行器服务在不同的线程中运行某些内容。我构造了一个可调用的,并将这个可调用传递给执行器服务.subm

  • 问题内容: 我有这样一行: Pylint显示警告: 这是为什么?列表理解是推荐的方法吗? 我当然可以这样重写: 而且我没有收到任何警告,但是我想知道是否为此有一个PEP? 问题答案: 皮林特(Pylint)经常谈论不该做的事情。您可以在.pylintrc文件中禁用警告。 此页面http://pylint-messages.wikidot.com/messages:w0141指示问题在于过滤器和映射

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回