python - 将项目添加到列表的副本中出现意外行为

标签 python python-3.x list logic

我向您展示两个函数:

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)

打印

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/

相关文章:

javascript - 使用 recorder.js 录制语音并将其上传到 python-flask 服务器,但 WAV 文件损坏

python - 如何仅选择数据框中每个用户 ID 的最新日期以及按用户 ID 列出的列表?

python - 将对象类型作为参数传递

将 xts 类复制到列表中

python - 在我的模块中导入一次外部包而不将其添加到命名空间

python - 报废数据并推送到 Elasticsearch 时出现SerializationError

python - 来自一个源代码树的多个分布

python - 尝试将具有特定扩展名的文件从源文件夹复制到目标文件夹

c# - List.Contains 无法正常工作

python - 包含重叠间隔的分块列表