我向您介绍两个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__的文档,但从中无法真正理解我的问题的解决方案。

最佳答案

在第一种情况下,您要将相同的对象([])传递给msg1msg2。当您使用msg1修改该对象时,msg2也会看到该更改。

如果要在msg2中使用其他对象,则还需要通过log复制:

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


这就是您在第二种情况下要做的,这就是它起作用的原因。

关于python - 将项目添加到列表的副本的意外行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56736128/

10-12 20:23