1

問題はstate変数(args)に起因します。それは私のコードで変更されています(new_state変更後)。ただし、使用することでこの種の問題を防ぐことができることを読みました(同じようにlist()見え、同じ参照があります)。statenew_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
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 に答える