scope, modyfing outside object from inside the method

Peter Otten __peter__ at web.de
Mon Sep 24 03:13:40 EDT 2007


Marcin Stępnicki wrote:

> Hello.
> 
> I thought I understand this, but apparently I don't :(. I'm missing
> something very basic and fundamental here, so redirecting me to the
> related documentation is welcomed as well as providing working code :).
> 
> Trivial example which works as expected:
> 
>>>> x = {'a':123, 'b': 456}
>>>> y = x 
>>>> x['a']=890
>>>> y
> {'a': 890, 'b': 456}
> 
> Now, let's try something more sophisticated (it's not real world example,
> I've made up the problem which I think illustrates my issue). Let's say
> I've got such a structure:
> 
> results = [ {'a': 12, 'b': 30 },
>             {'a': 13, 'b': 40 } ]
> 
> I'd like to have each row and column in separate object of self-made
> classes.:
> 
> class mycolumn():
>   def __init__(self, resultset, row, col):
> 	self.value = resultset[row][col]
>   def __str__(self):
> 	return 'Column value: %s' % self.value
> 
> class myrow():
>   def __init__(self):
> 	self.container = {}
>   def __str__ (self):
> 	return self.container
> 
> results = [
> 	{'a': 12, 'b' :30 },
>         {'a': 13, 'b' :40 } 
> ]
> 
> mystruct = []
> 
> for row in results:
> 	mystruct.append ( myrow() )
> 	for col in row:
>  	       	mystruct [len(mystruct)-1].container[col] = \
> 			 mycolumn(results, results.index(row), col)
> 
> print mystruct[0].container['b'] # 12
> results[0]['b'] = 50             # 
> print mystruct[0].container['b'] # also 12 :/
> 
> In other words, I'd like to "map" the results to myrow and mycolumn
> objects, and have these new objects' values changed when I change "results".

Instead of copying a value, you can tell your objects where to look it up.
Your mycolumn class would then become

class MyColumn(object):
    def __init__(self, resultset, row, col):
        self._resultset = resultset
        self._row = row
        self._col = col
    @property
    def value(self):
        return self._resultset[self._row][self._col]
    def __str__(self):
    	return 'Column value: %s' % self.value

Peter



More information about the Python-list mailing list