Добавление элемента в копию списка непредвиденного поведения - PullRequest
1 голос
/ 24 июня 2019

Я представляю вам два functions:

class Message:
def __init__(self, text, log):
    self.text = text
    self.log = log

def copy(self):
    return Message(self.text, self.log)

def add(self, more):
    self.text += more
    self.log += more
    return self
msg1 = Message("",[]).add("A")
msg2 = msg1.copy().add("B")
print(msg1.text, msg1.log)
print(msg2.text, msg2.log)

Это prints

A ['A', 'B'] AB ['A', 'B ']

Здесь происходит неожиданное (для меня):

list_1 = [1]
list_2 = list_1.copy()

list_2 += 'b'
print(list_1)  # prints [1]
print(list_2)  # prints [1,'b']

Так что я не могу понять, почему поведение не такоекак я использую + = в обеих функциях.Я прочитал документы для object.__iadd__, но не смог понять из него решение моей проблемы.

1 Ответ

2 голосов
/ 24 июня 2019

В первом случае вы передаете один и тот же объект ([]) обоим msg1 & msg2. Когда вы изменяете этот объект с помощью msg1, msg2 также видит это изменение.

Если вы хотите использовать другой объект в msg2, вам также необходимо скопировать log:

def copy():
    return Message(self.text, self.log.copy())

И это то, что вы делаете во втором случае, вот почему это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...