1

问题来自state变量(在 args 中)。它在我的代码中进行了修改(new_state修改后)。但是,我读过 usinglist()可以防止这种问题(它看起来statenew_state具有相同的参考)。

总而言之,如果我在函数的开头显示 state 的值,而在 return 之前,值是不同的(我显然不想改变这个变量的值!)。我怎么解决这个问题 ?

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
4

2 回答 2

2

它看起来像state一个列表列表?

当您这样做时new_state = list(state),您正在复制外部列表,但副本内的引用仍然指向相同的内部列表。

尝试这个:

new_state = [list(e) for e in state]
于 2013-03-16T17:07:35.937 回答
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'
于 2013-03-16T17:11:35.420 回答