[Tutor] Question on implmenting __getitem__ on custom classes

Arup Rakshit ar at zeit.io
Tue Apr 23 13:39:27 EDT 2019


On 23/04/19 10:08 PM, Steven D'Aprano wrote:
> On Tue, Apr 23, 2019 at 08:27:15PM +0530, Arup Rakshit wrote:
>
>>> You probably want:
>>>
>>>       def __init__(self, list=None):
>>>           if list is None:
>>>               list = []
>>>           self.list = list
>> That is really a new thing to me. I didn't know. Why list=None in the
>> parameter list is different than in the body of __init__ method? Can you
>> elaborate this?
> Try running this code and see what happens:
>
> def make_default():
>      print("creating a new list")
>      return []
>
>
> def function(arg=make_default()):
>      arg.append(1)
>      return arg
>
>
> Now call:
>
>
> function()
> function()
> function()
>
>
> and see if you can work out what is happening.
>
> Hint: how many new lists are created? when are they created?
>
>
>
Hello,

You are right. I didn't think on it, as it feels to me very natural as 
per the experiences from other language like Ruby, JS. It works 
differently there.

A similar Ruby code gives different output than Python does.

def make_default()
   print("creating a new list")
   return []
end

def function(arg=make_default())
   arg.push(1)
   return arg
end

# Now call:

p(function())
p(function())
p(function())

And on run:

ruby -v sample.rb
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
creating a new list[1]
creating a new list[1]
creating a new list[1]

But python gives to me:

creating a new list
[1]
[1, 1]
[1, 1, 1]

Python being an interpreted language works so differently than its other 
2 siblings Ruby, JS. Surprised.

-- 
Thanks,

Arup Rakshit



More information about the Tutor mailing list