【问题标题】:Int is not a keyword, What happens if we use it as a variable?Int 不是关键字,如果我们将它用作变量会发生什么?
【发布时间】:2020-08-07 05:22:56
【问题描述】:

Int 在 python 中不是关键字,因此可以用作变量名。 我尝试为名称分配一个字符串,它起作用了。

我是在 Python3.8.2 的 IDLE 中做的

>>> a = int(4.5)
>>> print(a)
4
>>> int = 'abc'
>>> print(int)
abc
>>> b = int(5.7)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    b = int(5.7)
TypeError: 'str' object is not callable
>>> print(b)

代码在没有最后一部分的情况下工作。 即来自 b = int(5.7)

为什么会这样? int 不应该是关键字吗? 我们如何修复它,保持现有代码完好无损,就像在控制台中工作一样?

我尝试使用 del 关键字,它成功了。但我不知道为什么。

>>> del int
>>> b = int(5.7)
>>> print(b)
5

这行得通。

请解释一下。 :)

【问题讨论】:

  • 好像有些名字不是关键字。 int 和 str 是两个例子。
  • 因为int只是一个变量,它指的是内置类int。就像如果你做class Foo: pass,那么你可以做Foo = 'a string'。类、函数等与 Python 中的任何其他对象一样是一流的对象

标签: python python-3.x class variables int


【解决方案1】:

基本类型都不是关键字,它们是类型对象

>>> type(int)
<class 'type'>

他们在使用时会创建自己的类的实例

>>> type(int('100'))
<class 'int'>

它们就像你自己定义的类一样工作

>>> class Foo:
...     pass
... 
>>> type(Foo)
<class 'type'>
>>> type(Foo())
<class '__main__.Foo'>

唯一的区别是它们在“builtins”命名空间中,但由于python的作用域规则,“builtins”是最后检查的。您创建的任何变量都在内置函数之前检查的命名空间中,因此会隐藏内置函数本身。

至于为什么,python 中几乎所有的东西都是一流的对象,它们都遵循相同的规则。 int 没有特殊代码或任何特殊规则(除了它的实现) - 它与任何其他类的工作方式相同。

命名空间是分层的,主要是内置的 --> 模块 --> 本地意味着本地阴影模块,它阴影内置。 del 从命名空间中移除一个变量,移除那个影子。如果您创建一个名为int 的变量,然后再创建一个del int,python 将不再在本地命名空间中找到它,并将回退到原来的位置。

当然,如果你愿意,你总是可以把事情搞得更长久:

>>> __builtins__.__dict__['int'] = float
>>> int(1)
1.0

【讨论】:

  • 并且要将int的值恢复为内置值,只需执行del int
  • @dawg - 对!我将对此添加注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2011-01-09
  • 2014-12-21
  • 2017-05-09
  • 2021-11-22
相关资源
最近更新 更多