我写了以下代码:
class node:
def __init__(self, title, series, parent):
self.series = series
self.title = title
self.checklist = []
if(parent != None):
self.checklist = parent.checklist
self.checklist.append(self)
当我创建这样的对象时:
a = node("", s, None)
b = node("", s, a)
print a.checklist
出乎意料的是,它将a和b对象都显示为print语句的输出。 我是python的新手。所以,可能有一些愚蠢的错误。
谢谢。
答案 0 :(得分:6)
您执行self.checklist = parent.checklist
,这意味着两个实例共享相同的列表。他们都加入了它,所以当你打印它时你会看到两个实例。
也许您想制作父列表的副本? self.checklist = parent.checklist[:]
答案 1 :(得分:1)
小心切片符号[:] 这将生成列表的副本,但如果列表包含其他列表,则这些列表本身将通过引用复制,而不是作为新对象复制。
例如::
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> x = [a,b]
>>> y = x[:]
>>> x
[[1, 2, 3], [4, 5, 6]]
>>> y
[[1, 2, 3], [4, 5, 6]]
>>> a.append(66)
>>> x
[[1, 2, 3, 66], [4, 5, 6]]
>>> y
[[1, 2, 3, 66], [4, 5, 6]]
^^^^^^^^^ unexpectedly y has an updated a inside it, even though we copied it off.
>>> import copy
>>> y = copy.deepcopy(x)
>>> a.append(77)
>>> x
[[1, 2, 3, 44, 55, 66, 77], [4, 5, 6]]
>>> y
[[1, 2, 3, 44, 55, 66], [4, 5, 6]]
^^^^^ y is a seperate object and so are all its children
您可能有兴趣使用id(y)来查看对象y的内存地址。