问题来自state
变量(在args中)。它在我的代码中进行了修改(在new_state
修改之后)。但是,我已经读过使用list()
可能会阻止此类问题(看起来state
和new_state
具有相同的引用)。
总而言之,如果我在函数的开头显示state的值,并且在返回之前,则值是不同的(我显然不想更改此变量的值!)。我该如何解决这个问题?
def successor(self, state, numberClients, numberDepots, Q, dist_table):
succ_list = list()
for i in range(0, len(state)):
for j in range(0, len(state[i])):
switchIndex = 0
while switchIndex < length:
permutationIndex = 0
while permutationIndex < len(state[switchIndex]):
new_state = list(state)
temp = new_state[switchIndex][permutationIndex]
new_state[switchIndex][permutationIndex] = new_state[i][j]
new_state[i][j] = temp
if checkConst(new_state): # accept only in some cases (we don't care here)
succ_list.append(('act', new_state))
permutationIndex += 1
switchIndex += 1
return succ_list
答案 0 :(得分:2)
看起来state
是一个列表列表?
执行new_state = list(state)
时,您正在复制外部列表,但副本中的引用仍指向相同的内部列表。
试试这个:
new_state = [list(e) for e in state]
答案 1 :(得分:0)
您自己找到了解决方案。调用中的引用:list(...)
将复制到新列表中。从本质上讲,它不是一个深层复制而是浅层复制。以下代码对此进行了解释。
>>> class A: pass
...
>>> a=map(lambda x:A(), range(5))
>>> a
[<__main__.A instance at 0x1018d11b8>, <__main__.A instance at 0x1018f17a0>, <__main__.A instance at 0x101868950>, <__main__.A instance at 0x1018687a0>, <__main__.A instance at 0x101868830>]
>>> b=list(a)
>>> b
[<__main__.A instance at 0x1018d11b8>, <__main__.A instance at 0x1018f17a0>, <__main__.A instance at 0x101868950>, <__main__.A instance at 0x1018687a0>, <__main__.A instance at 0x101868830>]
>>> b[0].v=23
>>> a
[<__main__.A instance at 0x1018d11b8>, <__main__.A instance at 0x1018f17a0>, <__main__.A instance at 0x101868950>, <__main__.A instance at 0x1018687a0>, <__main__.A instance at 0x101868830>]
>>> a[0]
<__main__.A instance at 0x1018d11b8>
>>> a[0].v
23
另外,为了防止出现此问题,您可以使用: -
import copy
然后,在代码中使用new_state = copy.deepcopy(state)
而不是new_state = list(state)
。
以下代码解释了这一点: -
>>> import copy
>>> copy.deepcopy
<function deepcopy at 0x1004d71b8>
>>> a=map(lambda x:A(), range(5))
>>> b=copy.deepcopy(a)
>>> b[0].v=23
>>> a[0].v
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'v'