Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

Python Programming Language

function in a function accessing vars


Hi all,

I wanted to solve a small problem, and I have a function that is
typically meant only as a function belonging inside another function.

>From the inner function I want to access a variable from the outer

function like;

def A():
  some_var = 1
  def B():
    some_var += 1

  B()

But this does not work, the function B does not recognize the
some_var. In my mind I thought the scope would propagate to the new
function and the vars would still be accessible.

How can I go about this?

With regards
- Jorgen

The problem here is the way python determines which variables are local to a
function - by inspecting left sides.

I'm not sure if there are any fancy inspection/stackframe/cells-hacks to
accomplish what you want. But the easiest solution seems to be a
(admittedly not too beautiful)

def A():
   some_var = [1]
   def B(v):
       v[0] += 1

   B(some_var)

Or you should consider making A a callable class and thus an instance, and
some_var an instance variable. Always remember: "a closure is a poor
persons object, and an object is a poor mans closure"

Diez

Hi Diez,

Thanks, I thought it worked similar to C++ where a higher compound
could access a lower section. But as it is not straight forward, I
think it is better to embed the functionality inside a class, and make
it a member variable .. now why didn't I think of that ;-)

Thanks,
- Jorgen

On 6/6/07, Diez B. Roggisch <d@nospam.web.de> wrote:

On Jun 6, 6:40 am, "Jorgen Bodde" <jorgen.maill@gmail.com> wrote:

> Hi Diez,

> Thanks, I thought it worked similar to C++ where a higher compound
> could access a lower section.

It can 'access a lower section'; what it can't do is *change* that
'lower section';  in your example case with an int, this matters
because ints are immutable. Lists, on the other hand, are mutable. You
can *access* the methods of the list that mutate it. You're always
working with the same list, but it has different contents when you
mutate it.

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc