0

Shouldn't the following code print? 100 100

price = 100  # assigns 'price' reference to 100
price = [price] # creates a 'price' list with 1 element: [100]

for i in range(1, 3):
    print(price[0]) # prints 100
    price[i] = price[i - 1]
    price.append(price[i])
    print(price[i])

Getting a IndexError: list assignment index out of range error at line price[i] = price[i - 1], but the line right before prints 100 successfully. Shouldnt price[i] simply be getting assigned price[0] value?

3
  • Issue is when trying to access python[i], then it throws index out of range. Left statement is not even evaluated Commented Mar 22, 2019 at 0:42
  • You're trying to append items to a list, see below. You can't just assign a value at nonexistent index positions and expect the list to automatically append or grow itself. Commented Mar 22, 2019 at 0:58
  • 1
    (Btw if you know a priori the list will have at least 3 elements, you could initialize it to price = [None] * 3 and you get [None, None, None]. Now you can directly assign to them. But, explicitly doing append is better practice.) Commented Mar 22, 2019 at 1:01

5 Answers 5

2

You're trying to append items to a list, or more precisely to initialize a list with repeated copies of something. Here are Pythonic ways to do that:

# Use a list comprehension
>>> price = [100 for _ in range(3)]
[100, 100, 100]

# Use itertools.repeat
>>> import itertools
>>> list(itertools.repeat(100, 3))
[100, 100, 100]

These are both faster than (repeatedly) doing append(), which is O(N), so repeatedly doing append() is O(N^2) on a long list, which gets very slow.

(Btw if you know a priori the list will have at least N elements, and N is large, you could initialize it to price = [None] * N and you get [None, None, None...]. Now you can directly assign to them. But, explicitly doing append is better practice for beginners.)

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

Comments

0

If you are just trying to append to a list, trying to do that with an index won't exactly work because that index isn't present in the list:

somelist = []
somelist[0] = 1
IndexError

So just use append

for i in range(1,3):
    price.append(price[i-1])

Comments

0

The problem is you are assigning at an index too great for the length of the array.

for i in range(1, 3):

This initializes i to 1. Since arrays are zero-indexed, and the length of your array is 1 on the first pass, you will hit an assignment out of range error at the line you mentioned (when i=1).

Here is a minimal example showing the issue:

my_array = ["foo"]
my_array[1] = "bar" # throws assignment out of range error

Comments

0

You can't assign a value to a list directly why this list has note a previous size defined. You have to use append to add elements to the position you want.

Check:

# Check the value on our initial position
print(price[0])
for i in range(1, 3):
    price.append(price[i-1])
    print(price[i])

Comments

0

That will not print out:

100

100

You initialized a list with 1 element, the size of that list is 1. However your range starts at 1 for the for loop , what's really happening is:

price = 100  # assigns 'price' to 100
price = [price] # creates a 'price' list with 1 element: [100]

for i in range(1, 3): # The list is 0-indexed, meaning price[0] contains 100
    print(price[0]) # prints 100 as it should
    price[i] = price[i - 1] # i is 1, price[i] is not an assigned value, i.e: you never assigned price[1]
    price.append(price[i]) # This doesn't execute because an exception was thrown
    print(price[i]) # Neither does this

To get the result you're looking for, this would work:

price = [100] # creates a 'price' list with 1 element: [100]

for i in range(0, 2): # Start at index 0
    print(price[i]) # Print current index
    price.append(price[i]) # Append current value of price[i] to the price list

To ensure everything appended as you expected you can test it with len:

print(len(price))

Output:3

However, it is a preferred way of appending as @smci has shown in his/her answer.

Comments

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.