问题
I’m writing a program that pulls a list of departments from a database. I want to avoid hardcoding this since the list may change.
I want to create a variable for each department to populate questions into a GUI. The problem I have is that I can create variables from the database list using the vars() function. I’m then storing the list of variable names so I can reference them elsewhere in my program. As long as I do everything in the same def, there is no problem. But I don’t know how to reference the dynamically created variables in a separate function.
Since I won’t know the variable names ahead of time, I don’t know how to make them available in other functions.
deptList = ['deptartment 1', 'deptartment 2', 'deptartment 3', 'deptartment 4', 'deptartment4']
varList=[]
def createVariables():
global varList
for i in range(len(deptList)):
templst=deptList[i].replace(' ', '')
varList.append(templst+'Questions')
globals()['{}'.format(varList[i])] = []
def addInfo():
global varList
print('varlist',vars()[varList[1]]) #Keyerror
createVariables()
print(varList)
vars()[varList[1]].append('This is the new question')
print('varlist',vars()[varList[1]]) #Prints successfully
addInfo()
回答1:
Do not use dynamic variables here. It makes no sense, just use one of Python's built-in containers, like a dict.
But, the reason your code isn't working is because vars() returns locals() when called with no argument. From the docs:
vars([object]) Return the
__dict__attribute for a module, class, instance, or any other object with a__dict__attribute....
Without an argument,
vars()acts likelocals(). Note, the locals dictionary is only useful for reads since updates to the locals dictionary are ignored.
So really, you just want to use the dict object returned by globals(). But this should make you wonder, why not just leave the global name-space out of it, and rather, just use your own custom dict object? Read this related question.
回答2:
Thanks for the tips. I was able to write the code I needed with a dictionary. Being new to python, it took a little trial and error, but the solution was better than what I was originally trying to do.
Thanks for your help!
来源:https://stackoverflow.com/questions/48145435/creating-variables-from-list-and-accessing-globally