How to create variable names with a "for" loop?

Question:

I know my title may be somewhat confusing, but I had trouble describing my issue. Basically, I need to create a bunch of variables that all equal 0, and I want to do this with a for loop so I don’t have to hard code it.

The problem is each variable needs to have a different name and when I call the number from my for loop to create the variable, it doesn’t recognize that I want the number from the for loop. Here is some code so that makes more sense:

total_squares = 8
box_list = []
for q in range(total_squares):
  box_q = 0
  box_list.append(box_q)

I need it to create box_1 and add that to the list, then create box_2, and add that to the list. Just it thinks I’m calling a variable box_q, rather than calling the number in the for loop.

Asked By: Logan Holmes

||

Answers:

Creating variables dynamically is an anti-pattern and should be avoided. What you need is actually a list:

total_squares = 8
box_list = []
boxes = [0] * total_squares
for q in range(total_squares):
  box_list.append(boxes[q])

Then you can refer to any element you want (say, box_i) using the following syntax:

my_box = box_list[boxes[i]]
Answered By: Selcuk

You can use dictionary. This approach is better in my opinion as you can see the the key and value pair.

code

total_squares=8
box_list={}
for q in range(total_squares):
    box_list['box_'+str(q)]=0

print(box_list)

output

{'box_0': 0, 'box_1': 0, 'box_2': 0, 'box_3': 0, 'box_4': 0, 'box_5': 0, 'box_6': 0, 'box_7': 0}
Answered By: user9221519

It looks like you’re trying to use the value of q to edit the ‘q’ in box_q, but q and box_q are two completely different variables.

You can manipulate variable names dynamically, but this is very rarely done in Python. Good explanation here: https://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html

Instead, you can use a list and access the items using list indexing, e.g.

total_squares = 8
box_list = []
for q in range(total_squares):
    box_list.append(0)

You access each item with box_list[0], box_list[1], etc. You can also create your boxes more succinctly:

boxes = [0] * total_squares

If you want your boxes to contain something, and have this naming structure, then you could use a dictionary:

boxes_dict = {'box_{}'.format(q): 0 for q in range(total_squares)}

This creates a dictionary with total_squares key-value pairs. You can access each box using boxes_dict['box_0'], boxes_dict['box_1'], etc. You can even change the values from 0 to put something in the box, e.g.

boxes_dict['box_2'] = "Don't use dynamic variable naming"
boxes_dict['box_3'] = 'And number your boxes 0, 1, 2 ... etc'
Answered By: ajrwhite
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.