On Sat, 26 Nov 2011 22:20:36 +0100, candide wrote: > In which cases should we use the is() function ? The is() function > compares identity of objects rather than values so I was wondering in > which circumstances comparing identities of objects is really vital.
`is` is not a function. It is a keyword and an operator. You should always use `is` when you intend to test for object identity, and never use `is` when you do not intend to test for object identity. For example: TASK: check whether a number is equal to 42. # WRONG don't do this if x is 42: ... # RIGHT use equality instead if x == 42: ... Object identity is the wrong solution here, because you cannot control whether Python will re-use the same object for every instance of 42, or different objects each time. TASK: check whether an object is a specific sentinel value, and no other value, even if it happens to compare equal to the sentinel. The most common sentinel is the singleton None. # WRONG don't do this if x == None: ... # RIGHT use is instead if x is None: ... Use of equality is inappropriate, because it tests whether the object compares equal to None. Although there are no built-ins that compare equal to None, there could be any number of custom objects that do, and so your code contains a bug: you intend to branch *only* on None, but might branch on some other object by mistake. > Examining well reputated Python source code, I realize that is() > function is mainly used in the following set form : > > spam is None > > But how much "spam is None" is different from "spam == None" ? Even if you can guarantee that your code base does not contain any object which compares equal to None except for None itself (and how would you do that? a full audit of every line of code in every library you use?), the use of `is` should be preferred because it signals your intention much better. If your intention is to accept arbitrary objects which compare equal to None, than by all means use == for your comparison. But normally the intention is to accept None, and nothing else. > is() function makes comparaison of (abstract representation of) adresses > of objects in memory. Comparing addresses of objects is a low level > feature performed by low level langages such as C but seldom needed in > high level languages like Python, isn'it ? That is correct. You probably should rarely use `is`. Apart from testing for None, use of `is` should be rare. -- Steven -- http://mail.python.org/mailman/listinfo/python-list