Python某些关键字似乎可用作变量名
我在Python(3.7.6)中偶然发现了一个有趣的现象。我想在序言中说,像这样命名变量是一个可怕的想法,人们永远不应该这样做。但是,下面的代码编译得非常惊人:Python某些关键字似乎可用作变量名,python,python-3.x,Python,Python 3.x,我在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); 由于元组不可调用,可
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);
可以成功地将元组强制转换为列表。对于几个不同的关键字,似乎存在这种行为。但是,对于某些关键字,这种行为是看不到的,例如从。有人能解释这种疯狂吗?具体来说,哪些关键字可以用作这样的变量,为什么一开始就允许这样做?
列表是一个内置函数。这不是一个关键词。
整个关键字列表可在此处查看-
关键字不能用作变量名或任何对象名。
但是内置函数名可以像您所说的那样重新定义
常见的混合用法是id
。比如说,
def getTableFromDatabase(id):
打印(id(dbname))#错误,cos id不是函数
返回getTable(dbname,id)
t=getTableFromDatabase(1)
,其中id
用于表的id。但是id
是内置函数之一。它用于获取对象的哈希id。
更好的做法是在这些关键字前面使用附加下划线
def getTableFromDatabase(\u id):
print(id(dbname))#打印dbname变量的id
返回getTable(dbname,\u id)
t=getTableFromDatabase(1)
列表
不是一个列表。它是绑定到builtins.list
的对象(特别是类型对象),在所有模块中用作回退。在命名空间中指定列表
变量时,会屏蔽原始类型对象。类型对象在内置中仍然可用
>>> 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']
但最好避免与这些类型混淆<代码>目录(内置)
会告诉你应该避免什么。这些都不是关键词。按定义关键字不能用作变量名。您可以使用import关键字获取当前python版本的关键字列表;print(keyword.kwlist)
无论如何,list
仅仅是一个内置函数的名称,与任何其他变量一样,它可以重新赋值,尽管这样做是非常不可取的。关键字的例子有class
、in
、for
等,通常是语句的一部分。作为旁白,我认为“cast”一词在Python中不是一种思考这些事情的有用方式。您正在将一个元组
对象传递给列表
对象构造函数,此构造函数将从该元组
中创建一个新的列表对象,因为列表
构造函数接受任何任意iterable。CaskCases带有较低的错误(Python)含义,从低级,静态类型的语言,如C和C++。但我知道“cast”只是泛指“convert”,这能回答你的问题吗?
>>> list=builtins.list
>>> list("bar")
['b', 'a', 'r']