gpt4 book ai didi

python - 在 python 中创建实例变量的副本

转载 作者:太空宇宙 更新时间:2023-11-04 10:19:10 26 4
gpt4 key购买 nike

在下面这段代码的 expand() 方法中,类变量 state 没有被直接赋值。但是,当我调用该方法时,状态类变量会发生变化。为什么会发生这种情况,我该如何避免?我想创建状态列表的副本,将 1 或 2 放在有“*”的地方,然后返回副本而不改变状态变量state。

例如如果

self.state = [['*','*','*'],['*','*','*'],['*','*','* ']]

子状态应该是 -

[[1,'*','*'],['*','*','*'],['*','*','*']]
[['*',1,'*'],['*','*','*'],['*','*','*']]
[['*','*',1],['*','*','*'],['*','*','*']]
[['*','*','*'],[1,'*','*'],['*','*','*']]
[['*','*','*'],['*',1,'*'],['*','*','*']]
[['*','*','*'],['*','*',1],['*','*','*']]
[['*','*','*'],['*','*','*'],[1,'*','*']]
[['*','*','*'],['*','*','*'],['*',1,'*']]
[['*','*','*'],['*','*','*'],['*','*',1]]

但我得到以下输出 -

[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]
[[1,1,1],[1,1,1],[1,1,1]]

class Node:
def __init__(self, state, node_type, parent=None):
self.state=state
self.node_type=node_type
self.parent=parent
self.depth=0

if parent:
self.depth = parent.depth + 1

def __repr__(self):
return "<Node %s>" % (self.state,)

def expand(self):
child_nodes = []

for i in range(0, len(self.state)):
for j in range(0, len(self.state[0])):
if self.state[i][j] == '*':
if self.node_type == 'max':
child_state = list(self.state)
child_state[i][j] = '1'
child_node = Node(child_state,'min',self)
elif self.node_type == 'min':
child_state = list(self.state)
child_state[i][j] = '2'
child_node = Node(child_state,'max',self)
child_nodes.append(child_node)

child_nodes.append(child_node)

#print self.state
return child_nodes

最佳答案

child_state = list(self.state) 创建列表的副本。这意味着任何 包含 的列表本身都不会被复制,新的 child_state 列表只包含引用。

您可以使用 copy.deepcopy() function让 Python 递归地克隆嵌套结构,或者使用列表理解来复制直接包含的列表:

child_state = [list(sub) for sub in self.state]

关于python - 在 python 中创建实例变量的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33451565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com