实习如何处理不可变对象?

Bre*_*ers 2 python tuples immutability python-3.5

如果我没记错的话a is b应该返回Trueifab指向同一个对象。对于两个相等的列表,它会返回False,因为这两个列表是两个不同的列表。我认为不可变对象没有这个问题,但是当我输入时:

a = (1, 2, 3)
b = (1, 2, 3)
a is b #returns false
Run Code Online (Sandbox Code Playgroud)

我认为这应该返回Truea指向b具有相同值的不可变对象。为什么我使用元组时没有a指向同一个对象b

hir*_*ist 5

您的 a 和 b 不指向同一个对象(您创建了两个单独的元组);您可以使用id(a)或 - 正如您所做的那样 - 使用进行检查a is b

a == b
Run Code Online (Sandbox Code Playgroud)

另一方面将会True

如果你希望它们指向同一个对象,你可以这样做

a = b = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

现在a is bTrue

这些都与可变性或不变性无关。list如果你用s 而不是s ,效果是一样的tuple

您可以将您的代码pythontutor可视化以查看发生了什么。

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