【问题标题】:Duplicated data in two different objects in pythonpython中两个不同对象中的重复数据
【发布时间】:2017-12-29 00:14:12
【问题描述】:

谁能帮我解决这个奇怪的问题?

https://travis-ci.org/ezored/ezored/jobs/322719711

在测试日志上,我打印:

当前数据:
['标志']
['标志']

那是行:

new_target_data.c_flags.extend(['flag'])

print('Current data:')
print(target_data.c_flags)
print(new_target_data.c_flags)

问题是当我扩展 "new_target_data.c_flags" 时。 “target_data.c_flags” 应用了相同的数据。它们是不同的对象,您可以在日志中查看内存引用:

<ezored.models.target_data.TargetData object at 0x2b59c0673590>
<ezored.models.target_data.TargetData object at 0x2b59c0673510>

带有测试代码的文件在这里(方法test_merge_target_data):

https://github.com/ezored/ezored/blob/issue_1/tests/models/test_target.py#L76

有人了解这个问题吗?我做错了什么?

【问题讨论】:

  • 其中一个很可能是另一个的影子副本,请提供这些项目的定义方式。
  • 嗨。它在帖子链接上。只需单击即可转到完整文件。但它已经得到了回答。
  • 我们不需要查看您的整个代码库来查找您可以在问题中轻松定义的内容。我要求您在问题中提供它们,因为问题应该是独立的。
  • 好吧,别担心。我想我输入了所有人都能理解的所有内容。用户“schwobaseggl”在这种模式下理解我提出并解决了问题。谢谢。

标签: python memory duplicates


【解决方案1】:

深入研究该代码库,您会发现以下类:

class TargetData(object):
    # ...
    c_flags = []
    # ...

如您所见,c_flags 是该类的一个类属性new_target_datatarget_data 都是此类的实例,并且预期访问 c_flags 将始终生成相同的对象。与其显示两个实例的内存位置,不如显示你正在变异的实际对象c_flags

print(id(new_target_data.c_flags))
print(id(target_data.c_flags))

你会发现它们是一样的。

【讨论】:

猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2017-03-07
  • 2021-10-03
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多