New submission from Ashish Shevale <shevaleash...@gmail.com>:

Consider the following piece of code

class MyClass:
    def do_something(self, a, b = []):
        b.append(a)
        print("b contains", b)
    def caller(self):
        a = (1,2)
        self.do_something(a)

a = MyClass().caller()
a = MyClass().caller()
a = MyClass().caller()

For this, the expected output would be

b contains [(1, 2)]
b contains [(1, 2)]
b contains [(1, 2)]

But actually comes out to be 

b contains [(1, 2)]
b contains [(1, 2), (1, 2)]
b contains [(1, 2), (1, 2), (1, 2)]

This only happens if in the do_something method, we append 'a' directly to 'b'. 
Instead, if we create a copy of parameter 'b', and append 'a' to the copy, 
there are no such side effects

----------
messages: 394199
nosy: shevaleashish
priority: normal
severity: normal
status: open
title: Bug in class method with optional parameter
type: behavior
versions: Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue44216>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to