使用循环中的新项来标识另一个列表

2024-04-27 16:55:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张名为MyList的名单。 我想将列表复制到一个新列表中,然后向新列表中添加项目,因此我执行以下操作:

MySecondList=MyList

for item in MyList:
    if item==2:
        MySecondList.append(item)

我遇到的问题是,这些项也将被添加到MyList中,事实上,循环也会不断地遍历MyList中的新项!!你知道吗

这正常吗?为什么会这样?迭代是否应该只使用原始列表MyList,而不是随着我添加到other列表的项的增加而增加?你知道吗


Tags: 项目in列表forifitemother名单
2条回答

是的,这是正常的,因为列表在python中是可变的,此操作:

MySecondList = MyList

只需创建对同一列表对象的新引用,并list.append就地修改同一对象(其他操作,如+=list.extendlist.pop等也会就地修改列表)

您可以在此处使用浅拷贝:

MySecondList = MyList[:]

演示:

>>> from sys import getrefcount
>>> lis = [1,2,3]
>>> foo = lis       #creates a new reference to the same object [1,2,3]
>>> lis is foo
True
>>> getrefcount(lis) #number of references to the same object
3                    #foo , lis and shell itself

#you can modify the list [1,2,3] from any of it's references
>>> foo.append(4)
>>> lis.append(5)
>>> foo,lis
([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])

>>> lis = [1,2,3]
>>> foo = lis[:]    #assigns a shallow copy of lis to foo
>>> foo is lis
False
>>> getrefcount(lis) #still 2(lis + shell_, as foo points to a different object
2

#different results here
>>> foo.append(4)
>>> lis.append(5)
>>> foo, lis
([1, 2, 3, 4], [1, 2, 3, 5])

对于列表列表(或可变对象列表)而言,浅表副本是不够的,因为内部列表(或对象)只是对同一对象的新引用:

>>> lis = [[1,2,3],[4,5,6]]
>>> foo = lis[:]
>>> foo is lis              #lis and foo are different
False

>>> [id(x) for x in lis]    #but inner lists are still same 
[3056076428L, 3056076716L]
>>> [id(x) for x in foo]    #same IDs of inner lists, i.e foo[0] is lis[0] == True
[3056076428L, 3056076716L]
>>> foo[0][0] = 100         # modifying one will affect the other as well
>>> lis[0],foo[0]
([100, 2, 3], [100, 2, 3])

对于这种情况,使用copy.deepcopy

>>> from copy import deepcopy
>>> lis = [[1,2,3],[4,5,6]]
>>> foo = deepcopy(lis)

因为它们都引用相同的列表(并且它们的id是相同的)。观察:

>>> a = [1,2,3]
>>> b = a
>>> b
[1, 2, 3]
>>> a is b
True
>>> b += [1]
>>> b
[1, 2, 3, 1]
>>> a
[1, 2, 3, 1]
>>> a is b
True

请改为:

MySecondList = MyList[:]

它的作用是复制一个列表,而不会改变原来的列表。也可以使用list(MyList)。你知道吗

相关问题 更多 >