1

I'm working with python 3.5, and insert isn't behaving as I expect it to.

scorelist = ["x","x"]

for q in range(0, len(scorelist)):
    if scorelist[q] == "x":
        scorelist.insert((q), " ")

I'd expect that to leave the least reading as follows

scorelist = ["x", " ", "x", " "]

Instead, it leaves me with

scorelist = [" ", " ", "x", "x"]

I'm pretty stumped as to why this is the output. Any guidance would be greatly appreciated.

1 Answer 1

6

It's generally a Bad Idea to mutate any container while iterating over it.

In your case, len(scorelist) is evaluated once, at the time the for loop begins. The length is 2 at that time, so the range is just [0, 1]. Nothing later can possibly change that.

In the first iteration, q is 0, and scorelist[0] is "x", so

scorelist.insert(0, " ")

leaves scorelist as

[" ", "x", "x"]

In the second iteration, q is 1, and for the new value of scorelist, scorelist[1] is still "x", so

scorelist.insert(1, " ")

leaves scorelist as

[" ", " ", "x", "x"]

Then the loop ends. There's nothing really mysterious about it, but it's far from obvious either - which is why it's a Bad Idea to mutate containers while iterating over them ;-)

EDIT: GETTING WHAT YOU WANT

If you're determined to insert a blank at the end, and between every pair of elements before that, here's one obscure way to do it:

for q in reversed(range(1, len(scorelist) + 1)):
    scorelist.insert(q, " ")

Then, e.g., if scorelist starts as

['x', 'y', 'z']

that loop will leave it as

['x', ' ', 'y', ' ', 'z', ' ']

By iterating "backwards", the insertions don't interfere with the original indices of the original list elements. If that's confusing (hint: it is! ;-) ), just work it out one iteration at a time, as I spelled it out for your original code.

Sign up to request clarification or add additional context in comments.

1 Comment

That makes a ridiculous amount of sense. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.