[Python-Dev] Possible bug in class-init, lookin for mentors

Antoine Rozo antoine.rozo at gmail.com
Fri Apr 21 12:45:12 EDT 2017


And it is not related to __init__ method.
You have the same behaviour with any other function or method.

>>> def append_to_list(item, l=[]):
...     l.append(item)
...     return l
...
>>> append_to_list(1)
[1]
>>> append_to_list(2)
[1, 2]

2017-04-21 17:18 GMT+02:00 Manolis Mavrofidis <mmavrofides at gmail.com>:

> In a nutshell.
> You create two instances and you assign the same list to both of them
> which you instantiate when you run your code.
> >>> id(spam_1.list)
> 4530230984 # <- Here
> >>> id(spam_2.list)
> 4530230984 # <- Here
> >>> id(spam_1)
> 4530231632 # Nice unique instance
> >>> id(spam_2)
> 4530231200 # Nice unique instance as well
>
> Try
> >>> class Foo:
> ...     def __init__(self, list=None):
> ...             self.list = list
> ...
> >>> spam_1 = Foo()
> >>> spam_2 = Foo([]) <- Cheating.
> >>> spam_1
> <__main__.Foo instance at 0x10e05d9e0>
> >>> spam_2
> <__main__.Foo instance at 0x10e05d950>
> >>> spam_2.list.append(42)
> >>> print(spam_1.list)
> None
> >>> print(spam_2.list)
> [42]
> >>> id(spam_1.list)
> 4527705752
> >>> id(spam_2.list)
> 4530231488
>
> Or something along those lines :)
>
> On 21 April 2017 at 16:03, Guyzmo via Python-Dev <python-dev at python.org>
> wrote:
> > On Fri, Apr 21, 2017 at 11:47:24AM +0200, Justus Schwabedal wrote:
> >> At least I think it's a bug.  Maybe it's a feature..
> >
> > it's indeed a feature.
> >
> >> I possibly found a bug in class __init__ and would like to fix it
> >
> > technically, it's a method. More precisely, it's the constructor method.
> >
> >> So I'm looking for a mentor to help me.
> >>
> >> class Foo:
> >>     def __init__(self, bar=[]):
> >>         self.list = bar
> >>
> >> spam_1 = Foo()
> >> spam_2 = Foo()
> >>
> >> spam_1.list.append(42)
> >> print(spam_2.list)`
> >
> > the argument `bar` of your method is instanciated at the time you're
> > declaring the method. It's happening once for the the lifetime of the
> > execution of your code.
> >
> > By allocating the `bar` reference into the `self.list` member, you're
> > assigning the same *instance* of that list into the `self.list` member.
> >
> > So everytime you create a new Foo instance, you're actually assigning
> > the same `[]` instance into `self.list` which is why, when you mutate
> > the list, it's happening in all the instances of Foo as well.
> >
> > I hope it makes sense to you !
> >
> > --
> > Guyzmo
> > _______________________________________________
> > Python-Dev mailing list
> > Python-Dev at python.org
> > https://mail.python.org/mailman/listinfo/python-dev
> > Unsubscribe: https://mail.python.org/mailman/options/python-dev/
> mmavrofides%40gmail.com
>
>
>
> --
> "Only those who will risk going too far
> can possibly find out how far one can go.
>  "T.S. Eliot
> http://0x109.tuxfamily.org
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: https://mail.python.org/mailman/options/python-dev/
> antoine.rozo%40gmail.com
>



-- 
Antoine Rozo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20170421/6f6dbec7/attachment.html>


More information about the Python-Dev mailing list