Python Forum
Is This Code Ok? How Can I Avoid Using Global Variables?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Is This Code Ok? How Can I Avoid Using Global Variables?
#1
I've heard from multiple sources I should try to avoid using global variables, since it's probably a sign of broken / badly written code. Here's an example of what I need to do:

list1 = None
list2 = None
list3 = None


def test():

    global list1
    list1 = [1, 2, 3, 4, 5]


def test2():

    global list2
    list2 = [6, 7, 8, 9, 10]


def test3():

    global list3
    list3 = [11, 12, 13, 14, 15]


test()
test2()
test3()

final_list = list1 + list2 + list3

print()
print(final_list)


'''

    in the full script LOTS of actions will be taken inside each function to generate the lists,
    this code is just for a very basic example of what I plan to do.

'''
I'm aware of 'return' and 'function parameters', I've been researching them in my free time today, but I can't get them to replace global variables in this situation.
Reply
#2
def test():
 return [1, 2, 3, 4, 5]
 
 
def test2():
    return [6, 7, 8, 9, 10]
 

def test3():
    return [11, 12, 13, 14, 15]


final_list = test1() + test2() + test3()
print()
print(final_list)
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply
#3
to elaborate further, based on DeaD_EyE's exmaple:
you can also assign what a function has returned to a variable to preserve and use latter in the code
my_list = test()
Reply
#4
if we replace the outside list from None to []... then append it inside function, should work the same. no parameters,return or global keywords needed. list id also preserved. jz repeat the same for test2() and test3(). did this in python 2.7 just in case error occured

list = []

def test():
 for a in range(1,6):
    list.append(a)
test()
Output:
list = [1,2,3,4,5]
swallow osama bin laden
Reply
#5
OP wants to avoid using global variable (good).
Your code is poor because it uses global variable, change it using mutability of list and uses built-in function list() as variable name. Don't do this...
Reply
#6
thx, will keep in mind on that variabe name

if preserving id is the reason im using global variable...
OP uses global variable , yet the list id changed , same goes to my_list = test()
so either way we end up using global variable?
swallow osama bin laden
Reply
#7
the idea is to keep namespaces separated and the scope of variables as narrow as possible. in the OP original code and your code you mix the global module namespace and the local function namespace
Reply
#8
(Feb-14-2018, 09:29 AM)DeaD_EyE Wrote:
def test():
 return [1, 2, 3, 4, 5]
 
 
def test2():
    return [6, 7, 8, 9, 10]
 

def test3():
    return [11, 12, 13, 14, 15]


final_list = test1() + test2() + test3()
print()
print(final_list)

I appreciate the help once again, DeaD_EyE Thumbs Up!

I think I understand 'return' well enough to use it in my projects now.

Part of my confusion was passing multiple objects into a single return, then combining them outside the function, but it seems easy in this case (multiple lists I want to combine). I'm still not 100% sure how to return different object types, like for example a string and a list through return, because then it's like they're combined into a single variable when you call the function.

Is the rule to only return 1 kind of data per function?

def test1():

    link_list1 = [1, 2, 3, 4, 5]
    link_list2 = [6, 7, 8, 9, 10]
    link_list3 = [11, 12, 13, 14, 15]

    return link_list1 + link_list2 + link_list3


def test2():

    link_list4 = [16, 17, 18, 19, 20]
    link_list5 = [21, 22, 23, 24, 25]
    link_list6 = [26, 27, 28, 29, 30]

    return link_list4 + link_list5 + link_list6


final_list = test1() + test2()
print()
print(final_list)
This forum is the best, its helped me overcome all the brick walls I've hit so far, you guys are amazing.
Reply
#9
you can return anything (i.e. any object), incl. some complex data structure like list/tuple of mixed element types, or dict, etc.
Reply
#10
You can return everything:

def foo():
    return {}, 'Foo', 42, 1337.13, [], ()
Implicit all arguments are packed into a tuple.
Afterwards you can unpack the objects.


Dict, String, Integer, Float, List, Tuple = foo()
Now the names refer to the objects.
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Trying to understand global variables 357mag 5 1,063 May-12-2023, 04:16 PM
Last Post: deanhystad
  Global variables or local accessible caslor 4 984 Jan-27-2023, 05:32 PM
Last Post: caslor
  global variables HeinKurz 3 1,100 Jan-17-2023, 06:58 PM
Last Post: HeinKurz
  Clarity on global variables JonWayn 2 904 Nov-26-2022, 12:10 PM
Last Post: JonWayn
  Avoid third party functions to wrote my python code into system debug-log? mark 9 2,138 Apr-09-2022, 08:41 PM
Last Post: mark
  Global variables not working hobbyist 9 4,614 Jan-16-2021, 03:17 PM
Last Post: jefsummers
  Global vs. Local Variables Davy_Jones_XIV 4 2,594 Jan-06-2021, 10:22 PM
Last Post: Davy_Jones_XIV
  Global - local variables Motorhomer14 11 4,125 Dec-17-2020, 06:40 PM
Last Post: Motorhomer14
  Question regarding local and global variables donmerch 12 4,974 Apr-12-2020, 03:58 PM
Last Post: TomToad
  local/global variables in functions abccba 6 3,356 Apr-08-2020, 06:01 PM
Last Post: jefsummers

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020