为什么以下代码在Python中表现异常?
>>> a = 256
>>> b = 256
>>> a is b
True # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False # What happened here? Why is this False?
>>> 257 is 257
True # Yet the literal numbers compare properly
我正在使用Python 2.5.2。尝试使用某些不同版本的Python,Python 2.3.3似乎在99到100之间显示了上述行为。
基于以上所述,我可以假设Python是内部实现的,因此“小”整数的存储方式与大整数的存储方式不同,并且is运算符可以分辨出这种差异。为什么要泄漏抽象?当我事先不知道它们是否为数字时,比较两个任意对象以查看它们是否相同的更好方法是什么?
看看这个:
>>> a = 256
>>> b = 256
>>> id(a)
9987148
>>> id(b)
9987148
>>> a = 257
>>> b = 257
>>> id(a)
11662816
>>> id(b)
11662828
这是我在Python 2文档“ Plain Integer Objects”(对于Python 3中相同)中找到的:
当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建int时,实际上实际上是返回对现有对象的引用。因此应该可以更改1的值。我怀疑在这种情况下Python的行为是不确定的。
问题内容: 在使用Python解释器时,我偶然发现了与运算符有关的这种冲突情况: 如果评估在函数中进行,则返回,如果在外部进行,则返回。 由于运营商评估的参与对象,这意味着和指向同一个声明的函数内时的实例,但是,相反,它们指向一个不同的对象在它之外时。 为什么会这样呢? 注意 :我了解Identity()和equal()操作之间的区别,如了解Python的“ is”运算符所述。此外,我还知道pyt
问题内容: 该运营商不匹配变量的值,但这些实例本身。 到底是什么意思 我声明了两个变量,并在两个变量中分配了相同的值,但是当我使用运算符时,它返回。 我需要澄清。这是我的代码。 问题答案: 您误解了操作员的测试内容。它测试两个变量是否指向同一个对象,而不是两个变量具有相同的值。 从操作员文档中: 运算符is和is not对象标识测试:当且仅当和y是相同对象时,才为。 改用运算符: 打印True。x
问题内容: 单元测试模块时遇到一个令人困惑的问题。该模块实际上是在转换值,我想比较这些值。 与和之间存在差异(部分,我谨防差异) 到现在为止,这是我的“问题”: 为什么?至少最后一个让我很困惑。的内部表示和应该相等。与的比较按预期进行。 问题答案: 这与工作方式有关。它检查引用而不是值。如果将任何一个参数分配给相同的对象,则返回。 在这种情况下,它们是不同的实例。并且具有相同的值,但就Python
问题内容: 我注意到我可以使用运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该运算符等效于该运算符) 我的问题是:什么时候操作员不只是比较身份? 编辑:我正在使用Python 3
问题内容: 操作员如何确定两个对象是否相同?它是如何工作的?我找不到记录。 问题答案: 从文档中: 每个对象都有一个标识,一个类型和一个值。一旦创建了对象,其身份就永远不会改变。您可能会认为它是对象在内存中的地址。“ is”运算符比较两个对象的身份;id()函数返回一个表示其身份的整数(当前实现为其地址)。 这似乎表明它在比较参数的内存地址,尽管它说“您可能将其视为对象在内存中的地址”这一事实可能
本文向大家介绍整理Python中的赋值运算符,包括了整理Python中的赋值运算符的使用技巧和注意事项,需要的朋友参考一下 下表列出了所有Python语言支持的赋值运算符。假设变量a持有10和变量b持有20,则: 例如: 试试下面的例子就明白了所有在Python编程语言可供选择的赋值运算符: 当执行上面的程序,它会产生以下结果: