Variable scope inside and outside functions - global statement being overridden by assignation unless preceded by reference
dn
PythonList at DancesWithMice.info
Tue Mar 5 13:23:41 EST 2024
Jacob,
Please reduce the problem to a small code-set which reproduces the
problem. If we can reproduce same, then that tells us something. At the
very least, we can experiment without having to expend amounts of time
in a (likely faulty) bid to reproduce the same environment.
Also, code is the ultimate description!
Perhaps start with a small experiment:
- after l_servers is created, print its id()
- after the global statement, print its id()
- after the clear/reassignment, print its id()
Is Python always working with the same list?
Please advise...
On 6/03/24 07:13, Jacob Kruger via Python-list wrote:
> Hi there
>
>
> Working with python 3.11, and, issue that confused me for a little
> while, trying to figure out what was occurring - unless am completely
> confused, or missing something - was that, for example, when having
> pre-defined a variable, and then included it in the global statement
> inside a function, that function was still referring to a completely
> local instance, without manipulating outside variable object at all
> unless I first executed a form of referral to it, before then possibly
> assigning a new value to it.
>
>
> Now, this does not seem to occur consistently if, for example, I just
> run bare-bones test code inside the python interpreter, but consistently
> occurs inside my actual testing script.
>
>
> Basically, in a file with python code in that am using for a form of
> testing at the moment, at the top of the file, under all the import
> statements, I initiate the existence of a list variable to make use of
>
> later:
>
>
> # code snippet
>
> l_servers = []
>
> # end of first code snippet
>
>
> Then, lower down, inside a couple of different functions, the first line
> inside the functions includes the following:
> # code snippet
> global l_servers
> # end code snippet
>
> That should, in theory, mean that if I assign a value to that variable
> inside one of the functions, it should reflect globally?
>
> However, it seems like that, while inside those functions, it can be
> assigned a new list of values, but if I then return to the scope outside
>
> the functions, it has reverted back to being an empty list = []?
>
>
> The issue seems to specifically (or not) occur when I make a call to one
> function, and, in the steps it's executing in one context, while it's
> not doing anything to the list directly, it's then making a call to the
> second function, which is then meant to repopulate the list with a brand
> new set of values.
>
>
> Now, what almost seems to be occurring, is that while just manipulating
> the contents of a referenced variable is fine in this context, the
> moment I try to reassign it, that's where the issue is occurring .
>
>
> Here are relevant excerpts from the file:-
>
>
> # start code
>
> # original assignation in main part of file
>
> l_servers = []
>
>
> # function wich is initially being executed
>
> def interact():
> global l_servers
> # extra code inbetween choosing what to carry out
>
> # ...
>
> # end of other code
>
> bl_response, o_out = list_servers()
>
> if bl_response: # just make sure other function call was successful
>
> l_servers.clear() # first make reference to global variable
>
> for srv in o_out: l_servers.append(srv) # now re-populate items
>
> # end code snippet from inside interact function
>
> # end of interact function
>
> # end of code snippet
>
>
> That other function being called from within, list_servers() was
> initially just trying to populate the values inside the global list
> variable itself, but was ending up in a similar fashion - reverting to
> initial empty value, but, the above now seems to work, as long as I
> first make reference to/manipulate/work with global variable instead of
> just trying to reassign it a brand new value/set of items?
>
>
> So, am I missing something obvious, have I forgotten about something
> else - yes, know that if was working from within an embedded function, I
> might need/want to then use the nonlocal statement against that variable
> name, but, honestly, just not sure how this can be occurring, and, it's
> not just with this one list variable, etc.?
>
>
> If I try simple test code from within the python interpreter, using
> different types of variables, this does also not seem to be the same all
> the time, but, don't think it can relate to an iterable like a list, or
> else, just in case, here is the code snippet with all the import
> statements from the top of that file, in case something could be
> overriding standard behaviour - not likely in this context, but, really
> not sure what's occurring:
>
> # import code snippet
>
> import requests, time
> from requests.auth import HTTPBasicAuth
> import psutil as psu
> import pytz
> import bcrypt
> from copy import copy
> from datetime import datetime, timedelta, timezone
> from dateutil.parser import parse
>
> # end of import snippet
>
>
> Thanks if you have any ideas/thoughts on the matter
>
>
> Jacob Kruger
> +2782 413 4791
> "Resistance is futile!...Acceptance is versatile..."
>
>
--
Regards,
=dn
More information about the Python-list
mailing list