Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

More concretely, one of the classic Python bugs is to use `[]` as a default argument and then mutate what "is obviously" a local variable.


I think it's even more safe/preferable to use non-mutable `None`s as a default and do:

``` def myfunc(x=None): x = x if x is not None else [] ... ```


In some cases you can also do:

  x = x or []
Your method is best when you might get falsy values but if that’s not an issue the `or` method is handy.


I tend to dislike this method as it's unclear what or returns unless you already know that or behaves this way. x if x is not None else default is cleaner in my opinion


I'm learning python, and I hit this milestone about a week ago!


What's it do?


When you set an object as a default that object is the default for all calls to that function/method. This also holds true if you create the object, like that empty list. So in this case, every call that uses the default argument is using the same list.

    def listify(item, li=[]):
        li.append(item)
        return li

    listify(1) # [1]
    listify(2) # [1, 2]




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: