Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Defining a default argument as a global variable

Suppose I have a Python function foo which takes a default argument, where that default is set to some global variable. If I now change that global variable before calling the function, the default argument is still set to the original value of that global variable.

For example:

x = 1

def foo(a=x):
    print a

x = 2
foo()

This prints 1, instead of 2.

How should I be writing my code, so that I can change this global variable, and have it update this default argument?

like image 857
Karnivaurus Avatar asked Mar 10 '17 12:03

Karnivaurus


1 Answers

A default variable is only evaluated and set once. So Python makes a copy of the reference and from then on, it always passes that reference as default value. No re-evaluation is done.

You can however solve this by using another object as default object, and then use an if statement to substitute it accordingly. Something like:

the_default = object()
x = 1

def foo(a = the_default):
    if a is the_default:
        a = x
    print a

x = 2
foo()

Note that we use is to perform reference equality. So we check if it is indeed the default_object. You should not use the the_default object somewhere else in your code.

In many Python code, they use None as a default (and thus reduce the number of objects the construct). For instance:

def foo(a = None):
    if a is None:
        a = x
    print a

Note however that if you do that, your program cannot make a distinction between a user calling foo() and foo(None) whereas using something as the_object makes it harder for a user to obtain a reference to that object. This can be useful if None would be a valid candidate as well: if you want foo(None) to print 'None' and not x.

like image 85
Willem Van Onsem Avatar answered Sep 27 '22 16:09

Willem Van Onsem