Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python某些关键字似乎可用作变量名_Python_Python 3.x - Fatal编程技术网

Python某些关键字似乎可用作变量名

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); 由于元组不可调用,可

我在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);

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

列表是一个内置函数。这不是一个关键词。
整个关键字列表可在此处查看-

关键字不能用作变量名或任何对象名。 但是内置函数名可以像您所说的那样重新定义

常见的混合用法是
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']