如何在不更改python的情况下访问类变量?

时间:2017-05-10 15:44:42

标签: python python-3.x

我是编程新手,对基本问题感到抱歉。我正在尝试为类编写搜索算法,我认为为每个搜索节点创建一个类会很有用。

qRegisterMetaType<ObjectListModel*>("ObjectListModel*");

也有一些功能。我现在尝试在类之外定义一个函数来创建节点的子节点并将它们添加到队列中。 node.current_state是一个列表

class Node(object):

    def __init__(self, path_to_node, search_depth, current_state):
        self.path_to_node = path_to_node
        self.search_depth = search_depth
        self.current_state = current_state

    ...

然后我尝试使用类似的if语句继续向下,向左和向右,但是由于original_state已经改变,它们被搞砸了。当我在up语句之后打印原始状态时,它返回在if语句中创建的up_state。我意识到(好吧,我认为)这是因为original_state,因此up_state实际上正在调用node.current_state,并且不将列表存储在单独的变量中。我应该如何从节点获取变量来独立操作?我甚至不应该使用类似的东西,也许是字典?我不需要为我编写的代码,但我会非常感谢概念性的推动!

2 个答案:

答案 0 :(得分:1)

如果您想避免修改原始

,则应使用copy.deepcopy
original_path = copy.deepcopy(node.path_to_node)
original_depth = copy.deepcopy(node.search_depth)
original_state = copy.deepcopy(node.current_state)

或者基本上你想用作&#34;工作副本&#34;如果您不想修改原始版本,则应该是原件的深层副本。

答案 1 :(得分:1)

对@ CoryKramer的答案进行了扩展答案:在Python中,对象有reference semantics,这意味着说

a = b

其中ab是对象,使ab引用同一个对象,这意味着更改a上的属性将会更改b上的相同属性也是如此。为了实际获得具有与旧属性相同属性的新对象,您应该使用已经说明的copy.deepcopy。但是,使用该功能时要小心。如果你的对象包含一个引用循环(即:它包含对包含对自身的引用的对象的引用),copy.deepcopy将导致无限循环。

出于这个原因,还有copy.copy,它不遵循要复制的对象中包含的对象引用。