[Tutor] Assigning a variable stored in a dictionary
Kent Johnson
kent37 at tds.net
Thu Jan 4 21:54:11 CET 2007
Tony Cappellini wrote:
>
> I can't see the forest through the trees.
>
> I have stored 3 global variables in a dictionary, and associated each
> variable with a filename.
> Ideally, I want to read the contents of the text files, and store the
> contents in the global variables. The globals will be used by another
> function.
> However, when I do the assignment to varname = fh.readlines(), a new
> variable is created, and the reference to the global variable is
> overwritten, because the contents of the files are strings, and strings
> are immutable.
>
> I see the problem, but not a good solution.
>
>
> var1=""
> var2=""
> var3=""
>
> def initGlobals():
>
> global var1, var2, var3
>
> fileDict = {'var1.txt ':var1, 'var2.txt':var2, 'var3.txt':var3}
>
> for fn, varname in fileDict.iteritems():
> try:
> try:
> fh=open(fn, 'r')
> #id(varname) # at this point, this id matches the id of
> the global variable
> varname = fh.readlines() # this creates a new variable,
> but I want to store the file contents in the global var
> #id(varname) # this is a new id, the
> global var is not updated
> fh.close()
> except IOError:
> print "\nFATAL ERROR occurred reading %s\n" % fn
> finally:
> fh.close()
You have a fundamental misunderstanding of the nature of variables and
names in Python. This may help:
http://effbot.org/zone/python-objects.htm
Python variables are *not* containers for values, they are references to
values. They are names for values. Some people like to think of a Python
name as a sticky note that gets put on the value, giving it a name. I
like to think of a name as pointing to a value.
The values of your fileDict are just references to the empty string,
they don't have any association at all with the global variables you
want to change; they just happen to have the same value.
The easiest solution is to just use the dict to store the file names and
data, forget about the global variables:
fileData = {}
for name in 'var1.txt', 'var2.txt', 'var3.txt':
f = open(name)
fileData[name] = f.readlines()
f.close()
At this point you have a dict whose keys are the three file names and
whose associated values are the contents of the files.
Kent
More information about the Tutor
mailing list