![]() |
1
330
看看这个:
编辑:这是我在python 2文档中发现的, "Plain Integer Objects" (对于 Python 3 ):
|
![]() |
2
81
总之,我要强调:
不要使用
这不是你应该期待的行为。
相反,使用
解释要了解这一点,您需要了解以下内容。
首先,什么是
所以下面是等价的。
从 documentation :
注意,cpython(Python的引用实现)中的对象ID是内存中的位置,这是一个实现细节。其他的python实现(如jython或ironpython)很容易对
那么用例是用来做什么的呢
问题您可以询问并说明以下问题(带代码):
它是
不
预期结果。为什么要这样?它只意味着整数的值为
但也许我们应该高兴的是,每当我们声明一个等于256的值时,内存中就没有一个新的独立实例。
我们现在有两个独立的整数实例,其值为
好吧,这看起来像是您的特定的python实现试图变得智能,除非必须这样做,否则不要在内存中创建冗余值的整数。您似乎表明您正在使用python的引用实现,即cpython。对CPython有好处。 如果cpython能够在全球范围内做到这一点,如果它能够以如此低的成本做到这一点(就像查找过程中的成本一样),也许另一个实现可能会更好。
但是对于代码的影响,您不应该关心整数是否是整数的特定实例。您应该只关心该实例的值是什么,并为此使用普通的比较运算符,即。
什么
|
![]() |
3
55
这取决于你想看两个东西是相等的还是相同的。
你应该使用
|
![]() |
4
37
我迟到了,但你想知道你的答案吗? *
关于cpython的好处是你可以看到它的来源。我将使用链接
在CPython
不知道你的情况,但我看到了这一点并认为: 让我们找到那个阵列!
如果你没有摆弄
现在,我们没有
所以它是一个宏,调用函数
那么什么是
所以我们的情况是
除了继续我们的旅程
好吧,宣布一个
是的,这是我们的人。当你想创建一个新的
由于引用引用了同一对象,因此发出
但是,它们是什么时候分配的呢??
During initialization in
希望我的解释能让你
但是,257是257吗?怎么了?这其实更容易解释, and I have attempted to do so already ;这是因为python将执行此交互式语句:
作为一个整体。在编译该语句的过程中,cpython将看到有两个匹配的文本,并将使用相同的文本
当cpython执行操作时,它现在只加载完全相同的对象:
所以
*--我将尝试以更具介绍性的方式来表达这一点,以便大多数人能够跟随。 |
![]() |
5
36
你可以办理登机手续 source file intobject.c ,python缓存小整数以提高效率。每次创建对小整数的引用时,都会引用缓存的小整数,而不是新对象。257不是一个小整数,因此它是作为另一个对象计算的。
最好用一下
|
![]() |
6
18
我认为你的假设是正确的。实验用
似乎数字
|
![]() |
7
12
对于不可变的值对象,如整数、字符串或日期时间,对象标识并不特别有用。最好考虑平等。标识本质上是值对象的实现细节——因为它们是不可变的,所以对同一对象或多个对象具有多个引用之间没有有效的区别。 |
![]() |
8
8
PHP's
PHP显然允许“内置”类使用相同的功能(我认为这是指在C级别实现,而不是在PHP中实现)。稍微不那么荒谬的用法可能是计时器对象,它每次用作数字时都有不同的值。你为什么要模仿Visual Basic的
格雷格·休吉尔(GregHewgill)做了一个澄清的评论:“我的目标是比较对象的同一性,而不是价值的平等。除了数字之外,我希望在这里将对象标识视为值相等。”
这将有另一个答案,因为我们必须将事物分类为数字或非数字,以选择是否与
我们可以试着用
顺便说一句, NumPy 将生成单独的低数字实例。
我真的不知道这个问题变种的答案。我想理论上可以用CTypes来调用
最后,这个问题源于python,它最初没有一个带有类似
Scheme's
|
![]() |
9
4
字符串也会发生这种情况:
现在一切都好了。
这也是意料之中的。
这是出乎意料的。 |
![]() |
10
3
看一看 here
|
![]() |
11
3
还有一个问题没有在任何现有答案中指出。python可以合并任意两个不可变的值,而预先创建的小int值并不是实现这一点的唯一方法。python实现永远不会 放心 这样做,但他们都做的不仅仅是小整数。
首先,还有一些其他预先创建的值,例如空值
但是,即使是未预先创建的值也可以相同。考虑这些例子:
这不仅限于
很明显,CPython没有预制构件
cpython编译器将合并一些已知的不可变类型的常量值,如
你可以通过分解字节码看到发生了什么。尝试定义一个函数
您可能会注意到编译器已存储
把它放到函数中,
还有一个CPython做的优化:字符串实习生。与编译器常量折叠不同,这不局限于源代码文本:
另一方面,它仅限于
无论如何,对于值必须是、可能是或不能是不同的规则,在不同的实现之间、同一个实现的版本之间、甚至在同一个实现的同一副本上运行同一代码之间,都会有所不同。 为了取乐,学习特定Python的规则是值得的。但是在代码中依赖它们是不值得的。唯一安全的规则是:
或者,换句话说,只使用
|
![]() |
minus one · 空条件和空合并运算符*与*纯布尔表示法 6 年前 |
![]() |
zaozaoer · >>java中带负字节值的and>>>运算符 6 年前 |
![]() |
Ganesh Thampi · 使用位的奇偶程序 6 年前 |
![]() |
FredMan · Rust中的<-符号是什么? 6 年前 |
![]() |
user9578589 · Java条件数组 6 年前 |
![]() |
Francisco José Letterio · 无法理解指针操作 6 年前 |
![]() |
Danny · 如何在r中键入grep中的运算符 6 年前 |
![]() |
David Rector · 什么是?=操作员在Swift中做什么? 6 年前 |
|
Gian · “/”操作符在Lua中提供什么功能? 6 年前 |