Python list slice syntax used for no obvious reason

后端 未结 5 2033
心在旅途
心在旅途 2020-11-27 17:00

I occasionally see the list slice syntax used in Python code like this:

newList = oldList[:]

Surely this is just the same as:



        
5条回答
  •  萌比男神i
    2020-11-27 17:33

    [:] Shallow copies the list, making a copy of the list structure containing references to the original list members. This means that operations on the copy do not affect the structure of the original. However, if you do something to the list members, both lists still refer to them, so the updates will show up if the members are accessed through the original.

    A Deep Copy would make copies of all the list members as well.

    The code snippet below shows a shallow copy in action.

    # ================================================================
    # === ShallowCopy.py =============================================
    # ================================================================
    #
    class Foo:
        def __init__(self, data):
            self._data = data
    
    aa = Foo ('aaa')
    bb = Foo ('bbb')
    
    # The initial list has two elements containing 'aaa' and 'bbb'
    OldList = [aa,bb]
    print OldList[0]._data
    
    # The shallow copy makes a new list pointing to the old elements
    NewList = OldList[:]
    print NewList[0]._data
    
    # Updating one of the elements through the new list sees the
    # change reflected when you access that element through the
    # old list.
    NewList[0]._data = 'xxx'
    print OldList[0]._data
    
    # Updating the new list to point to something new is not reflected
    # in the old list.
    NewList[0] = Foo ('ccc')
    print NewList[0]._data
    print OldList[0]._data
    

    Running it in a python shell gives the following transcript. We can see the list being made with copies of the old objects. One of the objects can have its state updated by reference through the old list, and the updates can be seen when the object is accessed through the old list. Finally, changing a reference in the new list can be seen to not reflect in the old list, as the new list is now referring to a different object.

    >>> # ================================================================
    ... # === ShallowCopy.py =============================================
    ... # ================================================================
    ... #
    ... class Foo:
    ...     def __init__(self, data):
    ...         self._data = data
    ...
    >>> aa = Foo ('aaa')
    >>> bb = Foo ('bbb')
    >>>
    >>> # The initial list has two elements containing 'aaa' and 'bbb'
    ... OldList = [aa,bb]
    >>> print OldList[0]._data
    aaa
    >>>
    >>> # The shallow copy makes a new list pointing to the old elements
    ... NewList = OldList[:]
    >>> print NewList[0]._data
    aaa
    >>>
    >>> # Updating one of the elements through the new list sees the
    ... # change reflected when you access that element through the
    ... # old list.
    ... NewList[0]._data = 'xxx'
    >>> print OldList[0]._data
    xxx
    >>>
    >>> # Updating the new list to point to something new is not reflected
    ... # in the old list.
    ... NewList[0] = Foo ('ccc')
    >>> print NewList[0]._data
    ccc
    >>> print OldList[0]._data
    xxx
    

提交回复
热议问题