Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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,我创建了两个相同的元组,并对它们使用了is运算符。应该得到的答案是false,但当我在vscode/atom/notepad++中使用它时,它是true,但当我在pthon run-through cmd中使用相同的代码时,它是false a = (1,2,3) b = (1,2,3) print(a is b) 实际结果应该是false,当我通过cmd或一些在线python编译器使用python时,结果应该是false,但当我使用vscode编写上述代码并创建.py文件时,结果是false

我创建了两个相同的元组,并对它们使用了is运算符。应该得到的答案是false,但当我在vscode/atom/notepad++中使用它时,它是true,但当我在pthon run-through cmd中使用相同的代码时,它是false

a = (1,2,3)
b = (1,2,3)

print(a is b)
实际结果应该是false,当我通过cmd或一些在线python编译器使用python时,结果应该是false,但当我使用vscode编写上述代码并创建.py文件时,结果是false。下图显示了我想说的内容

我的代码在vscode中,通过终端直接在终端执行:


我在linux中检查过,结果为False。这是因为当a和b指向同一个对象时,
a是b
将变为真
is
不比较元组的值。如果您定义
b=a
,那么您将得到True。您可以查看此讨论

这是由更改引入的更改

我们看到命令行(REPL)和脚本之间的不同行为。在命令行中输入的每一行都会在输入时编译和执行。一次编译所有脚本


通常,对于普通比较,应使用相等运算符(=)而不是标识运算符(is)。对于所有对象,相等运算符都有各种各样的策略来完成比较(实际上每个类都可以提供自己的
\uuuuu eq\uuuu
运算符)。identity操作符将只比较对象的ID。

CPython不承诺默认情况下插入不可变对象(字符串/元组),但在实践中,Python代码库中的很多地方都会重用已经创建的对象。这就是为什么您检查这些小对象的id是否相同的原因。IDE正在使用哪种Python?你自己用的是同一个吗?由于整数的元组是完全不可变的,因此我可以看到其他版本的Python将对象插入,从而使它们具有相同的id。不过,我并不指望CPython会这样做——在您拍摄的图片中看到版本字符串的其余部分会有所帮助。例如,PyPy将插入元组,至少是在脚本上运行,而不是以交互方式运行。我使用的是python 3.7。当代码在ide中编写,但使用terminalIt执行时,这似乎是Python 3.7的一个新特性,这是AST级常量折叠(因为一个数字元组实际上只是一个常量)和窥视孔优化器的结果。这不是这里发生的事情——正在创建两个独立的元组。OP希望ID有所不同,但有一种情况并非如此。我用python终端和运行记事本中编写的代码两种方式进行了检查。。结果总是假的。这意味着我们可能丢失了一条信息,而不是他将
a
分配给
b
。例如,使用pypy可以得到这个结果。PyPy可以插入整数的元组,因为一切都是不可变的,就像CPython对字符串所做的一样。:-)user10340258您是否使用了元组。我使用了Python3.7,我只写了3行代码,正如您所写,并使用了Python2.7.13。要确认任何python版本的这种行为,在python交互提示下,输入
a=(1,2,3);b=(1,2,3);在一行上打印(a是b)
。哇,我的意思是你太棒了,非常感谢你的帮助,我只是在做另一件事,就像这样,你节省了我的时间。只有一件事,通常整个脚本一次编译,命令行用于教学目的。在命令行或整个脚本中,哪一个是正确的操作?因此@Doug Henderson在空闲状态下的每一行>>>表示这将是一个脚本,下一个>>>将是另一个脚本