Python中的引用错误

时间:2013-03-16 17:03:42

标签: python reference

问题来自state变量(在args中)。它在我的代码中进行了修改(在new_state修改之后)。但是,我已经读过使用list()可能会阻止此类问题(看起来statenew_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

2 个答案:

答案 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'