python中有趣的列表行为

时间:2014-02-07 19:24:54

标签: python list python-2.7

在python 2.7中:

>>> a=[0,1,2,3]
>>> b=a
>>> for i in range(0,4):
...     if i==2:
...         b.remove(a[i])
>>> a
[0, 1, 3]
>>> b
[0, 1, 3]
>>> 

为什么?

我需要 a b 之间的区别,我要从列表中删除 b


确定。我正在提出这个问题。

我正在克隆包含此列表的对象。

例如:

class Ogr():
   a=[]
   .
   .
   .
   fillA():
      ...
      self.a=[0,1,2,3]

_______________________________________

ogr_temp=copy.copy(ogr)
for i in range(0,4):
   if i==2:
      ogr_temp.remove(ogr[i])
ogr
>>>    [0, 1, 3]
ogr_temp
>>>    [0, 1, 3]

我每次必须克隆班级中的所有列表吗?

2 个答案:

答案 0 :(得分:3)

ab是相同的列表。

如果您想要克隆,请使用b = a [:]。 (基本上从头到尾创建一个切片。)

如果您有一个包含列表成员的对象(正如您在评论中指出的那样),请尝试以下操作:

class A:
    def __init__ (self, lst = None): #Beware of mutable default arguments
        self.myList = lst [:] if lst else []

    def clone (self):
        return A (self.myList)

示例:

>>> a = A([1,2,3])
>>> b = a.clone()
>>> a.myList.append('only in a')
>>> print (a.myList)
[1, 2, 3, 'only in a']
>>> print (b.myList)
[1, 2, 3]

答案 1 :(得分:1)

如果我正确理解您的问题,您可以使用deepcopy

from copy import copy, deepcopy

class MyClass(object):
    def __init__(self):
        self.a = [1,2,3,4]

mc = MyClass()
mc2 = mc
mc3 = copy(mc)
mc4 = deepcopy(mc)

演示:

>>> id(mc)
139688808587984
>>> id(mc.a)
33373792
>>> id(mc2)
139688808587984
>>> id(mc2.a)
33373792
>>> id(mc3)
139688808537360
>>> id(mc3.a)
33373792
>>> id(mc4)      #mc4 is a different object than mc
139688808537808
>>> id(mc4.a)    #and mc4.a is a different object than mc.a
33404544         #any changes you make to mc4.a will not affect mc.a