Bill Punch<pu...@cse.msu.edu>  said:

<snip>

Default mutables are very confusing indeed. The recommended procedure is
to assign the default to be None, then check for that value in the
function and do the assignment there, such as:

def myFun(myList=None):
     if myList == None:
         myList = []
      ...

+1. This issue comes up on python-list about once a month.

So is the example of replicating a mutable as Mark showed.  To round out
the top three, which are the ones that get even my best students, look
at the below:

myVar = 27

def myFun ():
     print myVar
     myVar += 1
     return myVar

print myFun

What happens when you run this?

Oops, you meant *print myFun()* there. On the bright side, an error occurs, warning you of your errant ways:

  UnboundLocalError: local variable 'myVar' referenced before assignment


Perhaps more gotcha-esque is this similar situation, in which no error occurs:

#----------------------------------
class MyClass:
    var = 101    # class attribute

    def try_to_modify_class_attribute(self):
        self.var += 13

    def show(self):
        print self.var

obj1 = MyClass()
obj2 = MyClass()

obj1.try_to_modify_class_attribute()
obj1.show()  # output: 114
obj2.show()  # output: 101
#----------------------------------

-John

_______________________________________________
Edu-sig mailing list
Edu-sig@python.org
http://mail.python.org/mailman/listinfo/edu-sig

Reply via email to