如何在python中访问类变量而不更改它们?

如何在python中访问类变量而不更改它们?,python,python-3.x,Python,Python 3.x,我是编程新手,很抱歉问了个基本问题。我正在尝试为一个类编写一个搜索算法,我认为为每个搜索节点创建一个类会很有帮助 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_st

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

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

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

def bfs_expand(node, queuey, test_states):
    # Node Queue List -> Queue List
    # If legal move and not already in test states create and put children nodes
    # into the queue and their state into test_states. Return queue and test states

    # Copy original path, depth, and state to separate variables
    original_path = node.path_to_node
    original_depth = node.search_depth
    original_state = node.current_state

    # Check if up is legal, if so add new node to queue and state to test state
    if node.is_legal_move('Up'):
        up_state = original_state
        a = up_state.index(0)
        b = a - 3
        up_state[a], up_state[b] = up_state[b], up_state[a]
        if up_state not in test_states:
            test_states.append(up_state)
            up_node = Node(original_path + ['Up'], original_depth + 1, up_state)
            queuey.put(up_node)

    print(test_states)
    print(original_state)
然后,我尝试使用类似的if语句进行向下、向左和向右操作,但由于原始的_状态已更改,这些语句被弄乱了。当我在up语句之后打印原始状态时,它返回if语句中创建的up_状态。我意识到(嗯,我想)这是因为原始的状态,因此是向上的状态,实际上是调用node.current的状态,而不是将列表存储在单独的变量中。我应该如何从节点获取变量以进行独立操作?我甚至不应该用一个类来做类似的事情,也许是一本字典?我不需要为我编写代码,但如果能在概念上推动一下,我将不胜感激

如果要避免修改原始文件,应使用

original_path = copy.deepcopy(node.path_to_node)
original_depth = copy.deepcopy(node.search_depth)
original_state = copy.deepcopy(node.current_state)
或者,如果您不想修改原始版本,那么您想用作“工作副本”的任何对象都应该是原始版本的深度副本。

如果您想避免修改原始版本,则应该使用

original_path = copy.deepcopy(node.path_to_node)
original_depth = copy.deepcopy(node.search_depth)
original_state = copy.deepcopy(node.current_state)

或者,如果您不想修改原始版本,那么您想用作“工作副本”的任何对象都应该是原始版本的深度副本。

对@CoryKramer的答案进行一点扩展:在Python中,对象有,这意味着

a = b
如果
a
b
是对象,则
a
b
都会引用同一对象,这意味着更改
a
上的属性也会更改
b
上的相同属性。为了实际获得与旧对象具有相同属性的新对象,您应该使用前面所述的方法。但是,使用该功能时要小心。如果您的对象包含引用循环(即:它包含对对象的引用,而该对象包含对自身的引用),
copy.deepcopy
将导致无限循环


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

对@CoryKramer的答案进行一点扩展:在Python中,对象具有,这意味着

a = b
如果
a
b
是对象,则
a
b
都会引用同一对象,这意味着更改
a
上的属性也会更改
b
上的相同属性。为了实际获得与旧对象具有相同属性的新对象,您应该使用前面所述的方法。但是,使用该功能时要小心。如果您的对象包含引用循环(即:它包含对对象的引用,而该对象包含对自身的引用),
copy.deepcopy
将导致无限循环


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

必须阅读:@chepner感谢非常有用必须阅读:@chepner感谢非常有用