You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.4 KiB

From: faassen at (Martijn Faassen)
Date: Thu, 22 Apr 1999 19:49:24 +0200
Subject: Pointers to variables
References: <>
Message-ID: <>
Content-Length: 3214
X-UID: 11
Randall Hopper wrote:
> This doesn't work:
> for ( var, str ) in [( self.min, 'min_units' ),
> ( self.max, 'max_units' )]:
> if cnf.has_key( str ):
> var = cnf[ str ]
> del cnf[ str ]
> It doesn't assign values to self.min, self.max (both integers). The values
> of these variables are inserted into the tuples and not references to the
> variables themselves, which is the problem.
> How can I cause a reference to the variables to be stored in the tuples
> instead of their values?
Hi there,
I've been trying to understand the purpose of the code in your fragment
and your question for a minute or so, but I'm not entirely sure I get it
I'm assuming what you want is to get 'cnf[str]' assigned to self.min or
What you could do is something like this:
for str in ('min_units', 'max_units'):
if cnf.has_key(str):
setattr(self, str, cnf[str])
del cnf[str]
Tuples, by the way are immutable, so you can't change what values their
elements point to after they've been created (though if these values
point to other things themselves you can change that). That is, you
can't do this:
foo = (value1, value2)
foo[0] = "hey"
But, if you'd use a mutable list, you still run into trouble. If you say
mylist = [None] # list with a single element
variable_i_want_to_change = "Foo" # a variable I want to
mylist[0] = variable_i_want_to_change # okay, mylist[0] points to
same data
mylist[0] = "Bar" # now mylist[0] points to
different data
then 'variable_i_want_to_change' won't change. You've simply changed
what value mylist[0] points at. This is because a string (and integers
etc) are immutable values in Python. If you use a mutable value such as
a dictionary, you get this:
mylist = [None]
variable_i_want_to_change = {}
mylist[0] = variable_i_want_to_change
mylist[0]["some key"] = "bar" # indeed changes
# mylist[0] = "Bar" -- doesn't work, makes mylist[0] point elsewhere
I suspect I'm making things sound horribly complicated when they aren't
really. I can keep all this in my head easily, it's just hard
communicating it. I can understand the confusion with pointers from C,
but note that this is the actual semi-equivalent C code (of the first
fragment, not the dict one, and using ints instead of strings):
/* Initialize the variables, assume easy allocate functions which do all
malloc() calls I don't want to figure out right now */
int** mylist = allocate_list();
*mylist[0] = 0;
/* now we have a list with a pointer to an int value, which is 0 */
int* variable_i_want_to_change = allocate_int();
*variable_i_want_to_change = 1;
/* now we have a variable which points to an int value, which is 1 */
*mylist[0] = *variable_i_want_to_change;
/* now the data mylist[0] points at becomes 1 too */
*mylist[0] = 2;
/* now the data mylist[0] points at becomes 2 */
/* has the data *variable_i_want_to_change changed? no. I hope! :)*/
I don't expect this explained a lot. I feel like Tim Peters somehow...