【问题标题】:list attribute of object gets changed when calling del on a different attribute对不同属性调用 del 时,对象的列表属性会发生变化
【发布时间】:2018-01-01 13:11:33
【问题描述】:

我对以下代码的行为感到困惑:

data = [0,1,2,3,4,5]

class test():
  def __init__(self,data):
   self.data=data
   self.data2=data

  def main(self):
    del self.data2[3]

test_var = test(data)
test_var.main()
print(test_var.data)
print(test_var.data2)

我认为应该是这样的:

[0,1,2,3,4,5]
[0,1,2,4,5]

我得到的是这样的:

[0,1,2,4,5]
[0,1,2,4,5]

为什么第二个列表中的元素在没有直接更改时会被删除?或者python是否以正常发生的方式处理属性?

那么我应该如何更改我想要的代码?

【问题讨论】:

  • 您将相同的data 引用分配给不同的变量。输出是预期的。

标签: python python-3.x list object del


【解决方案1】:

Lists 在 Python 中是可变的并通过引用传递。每当您分配它或将其作为参数传递时,都会传递对它的引用而不是副本。因此,您看到的结果。如果你真的想对其进行变异,则需要对其进行深度复制。

import copy

class test():

    def __init__(self, data):
        self.data = copy.deepcopy(data)
        self.data2 = copy.deepcopy(data2)

# if the list is going to be flat and just contain basic immutable types,
# slicing (or shallow-copy) would do the job just as well.

class test():

    def __init__(self, data):
        self.data = data[::] # or data[:] for that matter as @Joe Iddon suggested
        self.data2 = data[::]

注意:并非所有类型的对象都支持“深度复制”。

【讨论】:

  • 很好的答案,只是补充一下,你可以用一个冒号进行浅拷贝:[:]
  • 感谢您的快速答复。我认为这将是一些我还没有得到的互动。再犯一个我以后不会犯的错误^^
  • @JoeIddon 谢谢。是的,我知道。我想,旧习惯很难改掉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2017-08-18
  • 2022-01-23
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多