Consider the following piece of code:
def func1(a):
a[:] = [x**2 for x in a]
a = range(10)
print a #prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
func1(a[:5])
print a #also prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
I wish to send a slice of the list a
and change it inside the function. My expected output is
[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]
Which way is the idiomatic way to do so?
Thanks!
No, slicing returns a list which is inside the original list. Not a copied list. But, in your code; there is a function which edits the parameter-list. If you are working with parameters, you must know that changes made at a parameter doesn't effect the original variable you pass into it.
Slicing lists does not generate copies of the objects in the list; it just copies the references to them. That is the answer to the question as asked.
With this operator, one can specify where to start the slicing, where to end, and specify the step. List slicing returns a new list from the existing list. If Lst is a list, then the above expression returns the portion of the list from index Initial to index End, at a step size IndexJump.
If you slice the list, you modify only a copy, so what you want to do doesn't work in the form you want.
But you could pass an optional slice
object to func1
and if it's not None
, use it to perform the slice assignment (else use [:]
)
I would do the following (used a lambda
to avoid copy/paste of the formula and a generator expression to avoid creating a useless temporary list:
def func1(a,the_slice=None):
e = lambda y : (x**2 for x in y)
if the_slice:
a[the_slice] = e(a[the_slice])
else:
a[:] = e(a)
testing:
a = list(range(10))
func1(a)
print(a)
a = list(range(10))
func1(a,slice(5)) # stop at 5
print(a)
a = list(range(10))
func1(a,slice(5,len(a),2)) # start at 5 / stop at the end, stride/step 2
print(a)
result:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 25, 6, 49, 8, 81]
This will work:
a = range(10)
a[:5] = [c**2 for c in a[:5]]
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