在Python中指向地址

时间:2018-03-31 16:36:07

标签: python memory-management

我正在有向图中进行广度优先搜索,我希望以(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的新手。

2 个答案:

答案 0 :(得分:2)

如果您正在使用liststuplesdict,甚至任何自定义创建的类来存储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“引用”方法的全部思想是使内存管理问题无声