我正在有向图中进行广度优先搜索,我希望以(node, parent data*)
形式递归存储数据。这递归怎么样?从root开始,它看起来像(root, None)
。然后,其子项的数据将为(child1, (root, None))
。然后child1的子项将存储(child2, (child1, (root, None)))
。
显然随着路径长度的增加,这会变成很多数据。我的问题是:假设我将一个变量分配给父数据,比如parent_data = (root, None)
,然后将子数据写为(child1, parent_data)
,是存储所有父数据的变量,还是只是一个引用根据请求访问父数据?我不想多次存储所有这些信息。
我希望我能做的只是有一个C ++样式指针,用C ++表示法我会指定tuple * parent_pointer = &(root, None)
。
这在Python中是否可行,甚至是必要的?
道歉,如果问题不明确,我是CS的新手。
答案 0 :(得分:2)
如果您正在使用lists
或tuples
或dict
,甚至任何自定义创建的类来存储parent_data,则默认情况下它将使用指针。即它不会复制数据。
示例:
In []: parent_data = ['root', None]
In []: child_data = ['child1', parent_data]
In []: child_data
Out[]: ['child1', ['root', None]]
In []: child_data[1][1] = "THIS USED TO BE NONE"
In []: child_data
Out[]: ['child1', ['root', 'THIS USED TO BE NONE']]
In []: parent_data
Out[]: ['root', 'THIS USED TO BE NONE']
In []: id(parent_data)
Out[]: 4705828232
In []: id(child_data[1])
Out[]: 4705828232
要执行基于值的副本,您需要使用:parent_data.copy()
答案 1 :(得分:1)
Python变量是对象的引用,此代码
obj1 = obj2
将在 obj1 中存储对 obj2 的引用 - 您可以在 id 函数的帮助下进行检查。
Python“引用”方法的全部思想是使内存管理问题无声