实习如何与不可变对象一起工作?

时间:2017-01-26 13:03:26

标签: python tuples immutability python-3.5

如果我没有弄错,a is b如果Truea指向同一个对象,则应返回b。使用两个相等的列表,它返回False,因为列表是两个不同的列表。我认为不可变对象没有这个问题,但是当我放入时:

a = (1, 2, 3)
b = (1, 2, 3)
a is b #returns false

我认为这应该返回True,因为ab指向具有相同值的不可变对象。当我使用元组时,为什么我不会a指向与b相同的对象?

2 个答案:

答案 0 :(得分:4)

你的a和b 指向同一个对象(你创建了两个单独的元组);您可以使用id(a)或 - 使用a is b检查该内容。

a == b
另一方面,

将是True

如果您希望它们指向您可以执行的同一对象

a = b = (1, 2, 3)

现在a is bTrue

这些都与可变性或不变性无关;如果您使用list而不是tuple s。它会起作用。

您可以直观地显示代码pythontutor以了解正在发生的事情。

Python会实际执行一些字符串和一些小整数(例如a=0; b=0; a is b会产生True)但并非所有不可变项都被实现。此外,您不应该依赖它,而应将其视为实现细节。

答案 1 :(得分:0)

您的代码永远不应该依赖于有关内容的详细信息并且不会被实施。它完全取决于实现,可以从点发布更改为单点发布。

实习仅仅是为了减少内存使用的优化而设计的,你是正确的,原则上任何不可变值的文字都可以被实现,但这只是在最微不足道的情况下实际完成的。 / p>

元组未被实习的一个可能原因是它们并非一成不变。如果你在其中添加了一些可变的内容(例如jsfiddle),那么实习它们可能会导致错误的行为,因为修改一个可以修改另一个。

你当然可以检查一个元组是否只包含不可变对象,但是元组可以任意嵌套,所以你必须做的工作来验证一个元组(只是传递)包含不可变对象,并且&# 39;真的不值得,因为你可以随时手动实习"如果你愿意的话。

({}, [])