如果我没有弄错,a is b
如果True
和a
指向同一个对象,则应返回b
。使用两个相等的列表,它返回False
,因为列表是两个不同的列表。我认为不可变对象没有这个问题,但是当我放入时:
a = (1, 2, 3)
b = (1, 2, 3)
a is b #returns false
我认为这应该返回True
,因为a
和b
指向具有相同值的不可变对象。当我使用元组时,为什么我不会a
指向与b
相同的对象?
答案 0 :(得分:4)
你的a和b 不指向同一个对象(你创建了两个单独的元组);您可以使用id(a)
或 - 使用a is b
检查该内容。
a == b
另一方面,将是True
。
如果您希望它们指向您可以执行的同一对象
a = b = (1, 2, 3)
现在a is b
是True
。
这些都与可变性或不变性无关;如果您使用list
而不是tuple
s。它会起作用。
您可以直观地显示代码pythontutor以了解正在发生的事情。
Python会实际执行一些字符串和一些小整数(例如a=0; b=0; a is b
会产生True
)但并非所有不可变项都被实现。此外,您不应该依赖它,而应将其视为实现细节。
答案 1 :(得分:0)
您的代码永远不应该依赖于有关内容的详细信息并且不会被实施。它完全取决于实现,可以从点发布更改为单点发布。
实习仅仅是为了减少内存使用的优化而设计的,你是正确的,原则上任何不可变值的文字都可以被实现,但这只是在最微不足道的情况下实际完成的。 / p>
元组未被实习的一个可能原因是它们并非一成不变。如果你在其中添加了一些可变的内容(例如jsfiddle
),那么实习它们可能会导致错误的行为,因为修改一个可以修改另一个。
你当然可以检查一个元组是否只包含不可变对象,但是元组可以任意嵌套,所以你必须做的工作来验证一个元组(只是传递)包含不可变对象,并且&# 39;真的不值得,因为你可以随时手动实习"如果你愿意的话。
({}, [])