Question: I'm used to seeing `if obj is None:` in Python, and I've recently come across `if obj is ():`. Since tuples are not mutable, it sounds like a reasonable internal optimization in the Python interpreter to have the empty tuple be a singleton, therefore allowing the use of `is` rather than requiring `==`. But is this guaranteed somewhere? Since which version of the interpreter?

[edit] the question matters because if () is not a singleton and there is a way of producing an empty tuple with a different address, then using `is {}` is a bug. If it is only guaranteed since Python 2.x with x > 0, then it is important to know the value of x if you need to ensure backward compatibility of your code. It is also important to know if this can break your code when using pypy / jython / ironpython...

Answer: 
From the Python 2 [docs](http://docs.python.org/reference/expressions.html#parenthesized-forms) and Python 3 [docs](http://docs.python.org/release/3.1.3/reference/expressions.html#parenthesized-forms):

> 
> ... two occurrences of the empty tuple may or may not yield the same object.
> 
> 
> 

In other words, you can't count on `() is ()` to evaluate as true.
It's not about optimization. It's about objects comparisons. Python "is" is used to test object identity, then compare empty tuple "()" is not required to use "==" operator. In fact, anything in python can be compared with "is".

```
>>> obj = ()
>>> obj is ()
True
>>> isinstance(obj, tuple)
True
>>> obj is tuple
False
>>> type(obj) is tuple
True
>>> type(())
<type 'tuple'>
>>> type(tuple)
<type 'type'>
>>> tuple == type(()) # value comparison with ==
True

```

Same for any other value:

```
>>> 333 is int
False
>>> type(333) is int
True
>>> isinstance(333, int)
True

```