【问题标题】:Python Certain Keywords Seem to be Usable as Variable Names [duplicate]Python某些关键字似乎可用作变量名[重复]
【发布时间】:2020-03-06 23:49:23
【问题描述】:

我在 Python (3.7.6) 中偶然发现了一个有趣的现象。我想先说这样的命名变量是一个可怕的想法,永远不应该这样做。然而,下面的代码却惊人地编译:

list = (123, "abc", 222, "foo", "bar", 333); #Tuple named list
print(list);

但是:

list = (123, "abc", 222, "foo", "bar", 333);
list = list(list);
print(list);

由于元组不可调用而引发类型错误,并且可能它认为您正在尝试调用元组而不是将元组强制转换为列表。

当然,通过改变变量名如下:

a = (123, "abc", 222, "foo", "bar", 333);
a = list(a);
print(a);

一个人能够成功地将一个元组转换为一个列表。似乎这种行为存在于几个不同的关键字中。但是,对于某些关键字,这种行为是不可见的,例如 from。谁能解释这种疯狂?具体来说,什么样的关键字可以用作这样的变量,为什么一开始就允许这样做?

【问题讨论】:

  • 这些都不是关键字。按定义关键字不能用作变量名。您可以使用import keyword; print(keyword.kwlist) 获取当前python 版本的关键字列表无论如何,list 只是一个内置函数的名称,并且像任何其他变量一样,它可以重新分配,尽管它是高度不建议这样做。关键字的示例是 classinfor 等,通常是语句的一部分。
  • 顺便说一句,这完全是一个废话,我认为“演员”这个词并不是在 Python 中思考这些事情的有用方式。您将tuple 对象传递给list 对象构造函数,该构造函数从tuple 中创建一个新列表对象,因为list 构造函数采用任意可迭代对象。 cast 一词带有来自低级静态类型语言(如 C 和 C++)的各种错误(在 Python 中)的含义。但我知道“cast”只是松散地用来表示“convert”
  • 这能回答你的问题吗? Why are 2 of the 6 built-in constants assignable?

标签: python python-3.x


【解决方案1】:

list 不是python keyword。它是一个绑定到builtins.list 的对象(特别是类型对象),在所有模块中用作后备。当您在命名空间中分配 list 变量时,您屏蔽了原始类型对象。类型对象在builtins中仍然可用

>>> import builtins
>>> list = "foo"
>>> list("bar")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>> builtins.list("bar")
['b', 'a', 'r']

而且你总是可以拿回来的

>>> list=builtins.list
>>> list("bar")
['b', 'a', 'r']

但最好避免与这些类型混淆。 dir(builtins) 会告诉你应该避免什么。

【讨论】:

    【解决方案2】:

    list 是一个内置函数。它不是关键字。 整个关键字列表可以在这里看到 - Python Keywords

    关键字不能用作变量名或任何对象名。 但是内置函数名可以按照你说的重新定义。

    常见的混合用法是id。例如,

    def getTableFromDatabase(id):
        print ( id(dbname) ) # error, cos id is not a function
        return getTable(dbname, id)
    
    t = getTableFromDatabase(1)
    

    ,其中id 用于表的id。但是id 是内置函数之一。它用于获取对象的哈希 id。 更好的做法是在此类关键字前使用附加下划线。

    def getTableFromDatabase(_id):
        print( id(dbname) ) # prints id of dbname variable
        return getTable(dbname, _id)
    
    t = getTableFromDatabase(1)
    

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 2018-05-07
      • 1970-01-01
      • 2017-06-02
      • 2020-11-01
      • 1970-01-01
      • 2012-12-08
      • 2019-06-19
      • 2011-01-17
      相关资源
      最近更新 更多