Python 使用循环中的新项将列表标识为另一个列表

Python 使用循环中的新项将列表标识为另一个列表,python,list,loops,Python,List,Loops,我有一个名为MyList的列表。 我想将列表复制到新列表中,然后将项目添加到新列表中,因此我会: MySecondList=MyList for item in MyList: if item==2: MySecondList.append(item) 我遇到的问题是,这些项目也将被添加到MyList中,事实上,循环也会不断通过MyList中的新项目 这正常吗?为什么会这样?迭代是否应该只使用原始列表MyList,而不是随着我添加到其他列表中的项目的增加而增加?,因为

我有一个名为MyList的列表。 我想将列表复制到新列表中,然后将项目添加到新列表中,因此我会:

MySecondList=MyList

for item in MyList:
    if item==2:
        MySecondList.append(item)
我遇到的问题是,这些项目也将被添加到MyList中,事实上,循环也会不断通过MyList中的新项目


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

,因为它们都引用相同的列表(并且它们的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)

,因为它们都引用相同的列表(并且它们的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)

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

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

您可以在此处使用浅层副本:

MySecondList = MyList[:]
演示:

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

>>> 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)

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

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

您可以在此处使用浅层副本:

MySecondList = MyList[:]
演示:

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

>>> 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)

谢谢你的回答,也是信息性的:)谢谢你的回答,也是信息性的:)