【问题标题】:How to avoid objects of a same class having same id?如何避免同一类的对象具有相同的 id?
【发布时间】:2016-04-22 08:54:48
【问题描述】:

我正在尝试在类的许多实例中使用特定对象。但是,每当我向该对象添加一个值时,事实证明它正在将该值添加到该类的所有其他实例的对象中。

This SO post 建议我的对象具有相同的 id,因为 GC 在同一内存上释放和加载对象。

节点类有一个对象邻居设置为neighbors = []

grid = [[node() for x in range(col)] for y in range(row)]

temp1 = grid[0][0].neighbors
temp2 = grid[4][0].neighbors

print id(temp1)
print id(temp2)

temp1.append("sth")

print temp1
print temp2

输出:

38412376
38412376
['sth']
['sth']

temp2 有一个空列表的可能解决方法是什么?

【问题讨论】:

  • 你可能想看看copy.deepcopy
  • 向我们展示Node__init__() 方法的代码。您可能使用[] 作为参数neighbors 的默认值。这可能会导致您描述的行为。

标签: python memory memory-management garbage-collection nodes


【解决方案1】:

我猜你在Node.__init__()做类似的事情:

class Node(object):
    def __init__(self, neighbors=[]):
        self.neighbors = neighbors

n1 = Node()
n2 = Node()

>>> n1.neighbors is n2.neighbors
True
>>> n1.neighbors.append('hi')
>>> n2.neighbors
['hi']

那是因为它们是同一个列表。你可以这样做:

class Node(object):
    def __init__(self, neighbors=None):
        if neighbors is not None:
            self.neighbors = neighbors
        else:
            self.neighbors = []

n1 = Node()
n2 = Node()

>>> n1.neighbors is n2.neighbors
False
>>> n1.neighbors.append('hi')
>>> n2.neighbors
[]

问题解决了吗?

【讨论】:

  • 我就是这么做的。我已经声明了一个列表neighbors = []。然而,在我的 Node 类中,我还声明了 pos = ""visited = True。但是当我以相同的方式在一个实例中更改它们时,这似乎不会像邻居列表那样影响不同实例的其他对象。这是为什么呢?
  • 那是因为字符串和布尔值(整数)是不可变的。你不能改变他们的价值观。当您尝试更改它们时,实际上是 重新绑定 一个新实例到一个属性或变量。列表是可变容器;他们的物品可以在不改变容器的情况下改变。在将列表用作函数的默认参数的情况下,在定义函数时只会创建一个列表。最好解释一下here
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 2018-02-13
  • 2023-02-01
  • 2020-02-04
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多