Bill Punch<punch@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
participants (1)
-
John Posner