By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,898 Members | 1,245 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,898 IT Pros & Developers. It's quick & easy.

function in a function accessing vars

P: n/a
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
Jun 6 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Jorgen Bodde wrote:
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?
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
Jun 6 '07 #2

P: n/a
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 <de***@nospam.web.dewrote:
Jorgen Bodde wrote:
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?

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
--
http://mail.python.org/mailman/listinfo/python-list
Jun 6 '07 #3

P: n/a
On Jun 6, 6:40 am, "Jorgen Bodde" <jorgen.maill...@gmail.comwrote:
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.
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 ;-)
Jun 6 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.