对于上图的运行结果,可能大家会和我一样有点小惊讶
- 对于list不会出现差异
- 分行赋值也不会出现
a is b == True
的结果
我的理解是解释器做了一点优化,对作为不可变类型的tuple在一行代码内不会重复创建。
但这么做真的好吗,虽然从实用角度,并没有引出什么坑,但还是有损一个语言的逻辑自洽的。作为强迫证不认可,虽然python其实已经不少这类小缺口了。
对于上图的运行结果,可能大家会和我一样有点小惊讶
a is b == True
的结果我的理解是解释器做了一点优化,对作为不可变类型的tuple在一行代码内不会重复创建。
但这么做真的好吗,虽然从实用角度,并没有引出什么坑,但还是有损一个语言的逻辑自洽的。作为强迫证不认可,虽然python其实已经不少这类小缺口了。
依照官方文档:
The operators is and is not test for object identity: x is y is true if and only if x and y are the same object. x is not y yields the inverse truth value.
https://docs.python.org/3/ref...
is
用来判断前后是不是同一个对象。
你可以使用 id()
方法来看看前后两个操作数的对象ID,
"Fluent Python" 有一个小章节 "Tricks Python Plays with Immutables" 写过这类问题。
作者说,这些解释器的优化,并没有文档明示,不同版本也可能有不同的做法。只要你的代码不依赖这些优化特性,其实不会影响我们对python的使用。所以权当了解,不必纠结了。
4 回答4.5k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
2 回答428 阅读✓ 已解决
用控制台执行这个代码反而增加了你的疑问,(1,2)不是解析时创建的,是位于常量池的一个常量 所以同一个codeobject中 (1,2) is (1,2) 。a = (1,2) / b = (1,2) 在控制台中时不同的两个codeobject 所以 a is not b ,如果在py文件中直接执行 a is b