I did quite a bit of perusing, but I don't have a definite answer for the concept that I'm trying to understand.
In Python, if I take a list, such as:
L1=['muffins', 'brownies','cookies']
And then attempted to replace the first pointer to an object in the list, namely 'muffins' by using the code:
L1[0:1] = 'cake'
I would get a list L1:
['c', 'a', 'k', 'e', 'brownies', 'cookies']
Yet if I took the same list and performed the operation (now with the 4 elements from the string cake):
L1[0:4] = ['cake'] # presumably, it's now passing the string cake within a list? (it passed into the modified list shown above)
I get the output I initially desired:
['cake', 'brownies', 'cookies']
Can anyone explain why that is, exactly? I'm assuming that when I take cake initially without it being in a "list", it breaks the string into its individual characters to be stored as references to those characters as opposed to a single reference to a string...
But I'm not entirely sure.
So far, we have shown examples of lists ( list type), but slices can be used with other sequence objects such as strings str and tuples tuple as well. However, str and tuple are immutable, so new values cannot be assigned.
As well as using slicing to extract part of a list (i.e. a slice on the right hand sign of an equal sign), you can set the value of elements in a list by using a slice on the left hand side of an equal sign. In python terminology, this is because lists are mutable objects, while strings are immutable.
slice() The slice() method extracts a section of a string and returns it as a new string, without modifying the original string.
The format for list slicing is [start:stop:step]. start is the index of the list where slicing starts. stop is the index of the list where slicing ends. step allows you to select nth item within the range start to stop.
Two important points:
Thus
L1[0:1] = 'cake'
replaces the first element of L1
with the individual characters of 'cake'
.
To replace the first element with the string 'cake'
, simply write:
L1[0] = 'cake'
or, using the slice assignment syntax:
L1[0:1] = ['cake']
If you specify a slice, the righthand side is presumed to be a list/tuple (actually, any iterable - but watch out for generators that produce an indefinite number of values).
To replace an item in a list, use:
my_list[0] = "cake"
(You could also do
my_list[0:1] = ["cake"]
if you really want to use a list slice.
Here are a couple other relevant refs: slice assignment more slice assignment
Think of strings as being a sequence container that stores characters. When you try to do assignments that way, it adds each item in the character sequence to the list. By wrapping "cake" in its own 1-element list first (let's call it L2), you're instead adding each element of L2 to L1 -- it does not recursively split up sequence containers beyond the outermost sequence.
L1 = ['muffins', 'brownies','cookies']
L2 = ['cake']
L1[0:1] = L2
print L1
['cake', 'brownies', 'cookies']
This is also true for other nested sequence objects. Try experimenting with more nested sequence objects like this:
L3 = [['pie', 'eclairs'], ['bacon', 'chocolate']]
L1[0:1] = L3
print L1
[['pie', 'eclairs'], ['bacon', 'chocolate'], 'brownies', 'cookies']
It's also worth noting that if you don't care about order/positioning in the list, you can use append()
and not have to worry about your string getting split up:
L1 = ['muffins', 'brownies','cookies']
L1.append('cake')
print L1
['muffins', 'brownies', 'cookies', 'cake']
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With