How assignment works with Python list slice?

前端 未结 4 1190
灰色年华
灰色年华 2020-11-21 23:19

Python doc says that slicing a list returns a new list.
Now if a "new" list is being returned I\'ve the following questions related to "Assignment to sl

相关标签:
4条回答
  • 2020-11-21 23:24

    When you specify a on the left side of the = operator, you are using Python's normal assignment, which changes the name a in the current context to point to the new value. This does not change the previous value to which a was pointing.

    By specifying a[0:2] on the left side of the = operator, you are telling Python you want to use Slice Assignment. Slice Assignment is a special syntax for lists, where you can insert, delete, or replace contents from a list:

    Insertion:

    >>> a = [1, 2, 3]
    >>> a[0:0] = [-3, -2, -1, 0]
    >>> a
    [-3, -2, -1, 0, 1, 2, 3]
    

    Deletion:

    >>> a
    [-3, -2, -1, 0, 1, 2, 3]
    >>> a[2:4] = []
    >>> a
    [-3, -2, 1, 2, 3]
    

    Replacement:

    >>> a
    [-3, -2, 1, 2, 3]
    >>> a[:] = [1, 2, 3]
    >>> a
    [1, 2, 3]
    

    Note:

    The length of the slice may be different from the length of the assigned sequence, thus changing the length of the target sequence, if the target sequence allows it. - source

    Slice Assignment provides similar function to Tuple Unpacking. For example, a[0:1] = [4, 5] is equivalent to:

    # Tuple Unpacking
    a[0], a[1] = [4, 5]
    

    With Tuple Unpacking, you can modify non-sequential lists:

    >>> a
    [4, 5, 3]
    >>> a[-1], a[0] = [7, 3]
    >>> a
    [3, 5, 7]
    

    However, tuple unpacking is limited to replacement, as you cannot insert or remove elements.

    Before and after all these operations, a is the same exact list. Python simply provides nice syntactic sugar to modify a list in-place.

    0 讨论(0)
  • 2020-11-21 23:34

    I came across the same question before and it's related to the language specification. According to assignment-statements,

    1. If the left side of assignment is subscription, Python will call __setitem__ on that object. a[i] = x is equivalent to a.__setitem__(i, x).

    2. If the left side of assignment is slice, Python will also call __setitem__, but with different arguments: a[1:4]=[1,2,3] is equivalent to a.__setitem__(slice(1,4,None), [1,2,3])

    That's why list slice on the left side of '=' behaves differently.

    0 讨论(0)
  • 2020-11-21 23:36

    By slicing on the left hand side of an assignment operation, you are specifying which items to assign to.

    0 讨论(0)
  • 2020-11-21 23:38

    You are confusing two distinct operation that use very similar syntax:

    1) slicing:

    b = a[0:2]
    

    This makes a copy of the slice of a and assigns it to b.

    2) slice assignment:

    a[0:2] = b
    

    This replaces the slice of a with the contents of b.

    Although the syntax is similar (I imagine by design!), these are two different operations.

    0 讨论(0)
提交回复
热议问题