A couple of good questions from a recent delegate...
Q. How do I check for the existance of a variable in Python?
A. Reference it and see if an exception is thrown. Here's an example in which I create a variable only if my program is run with command line parameters:
import sys
if len(sys.argv) > 1:
thing = "Called with parameters"
try:
thing
have = "something"
except:
have = "nothing"
print have
And running that gives me:
WomanWithCat:twcrp grahamellis$ python pval qweqeqwe
something
WomanWithCat:twcrp grahamellis$ python pval
nothing
WomanWithCat:twcrp grahamellis$
If you don't like exceptions (!), you could always try the dir function which returns you symbol table contents...
if "thing" in dir():
print "have"
else:
print "have not"
The question concerns me slightly - as it's usually good coding practise to know what variables you have, and to clean up optional temporary ones at the closure of a scope.
Q. Python subroutine calls, are they "by value" or "by reference" or both?
A. They are called by
reference. Which means that the address at which a variable id held is passed into the method / function (they're not really called "subroutines") and it's very efficient in that way. It also means that if you make changes within the variable's contents inside the method, you'll also change what the reference outside the function considers to be a value. Consider the internal name to be an alternative name or alias for the same thing.
def employ(team,add):
team.append(add)
def unemploy(team, subtract):
team.remove(subtract)
people = ["Amanda","Bob","Chris","Deborah"]
employ(people,"Eric")
unemploy(people,"Bob")
print people
And that runs as follows - with the changes show within the methods reflcted outside
WomanWithCat:twcrp grahamellis$ python pin
['Amanda', 'Chris', 'Deborah', 'Eric']
WomanWithCat:twcrp grahamellis$
There is, however, a further issue to consider - my correspondent writes:
"Here I am getting confused, looks like list is by-reference and integer is by-value. What rule is Python following?"
It's by REFERENCE. However, some variables (tuples and integers for example) are immutable and that means that when their value is altered a new variable / reference name is created. And if that's just under the alias name,it leaves the original name pointing to the original value, thus giving the
appearance of call be value.
You can see how that works using Python's
id function ...
def stepup(thisval):
print id(thisval)
thisval += 1
print id(thisval)
lucky = 7
print id(lucky)
print lucky
stepup(lucky)
print id(lucky)
print lucky
Which reports a brand new object after the += operation ... but ONLY at that point:
4352717096
7
4352717096
4352717072
4352717096
7
Using a list with a single member, you can get the opposite behaviour:
4499263856
[7]
4499263856
4499263856
4499263856
[8]
(written 2013-08-27, updated 2013-08-31)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Y109 - Python - Exceptions [381] Exceptions in Python - (2005-07-17)
[1042] Nested exceptions in Python - (2007-01-18)
[1236] Trying things in Python - (2007-06-18)
[2018] UnboundLocalError - Python Message - (2009-01-31)
[2281] Python - using exceptions to set a fallback - (2009-07-12)
[2368] Python - fresh examples of all the fundamentals - (2009-08-20)
[2408] Robust user input (exception handling) example in Python - (2009-09-17)
[2622] Handling unusual and error conditions - exceptions - (2010-02-03)
[2994] Python - some common questions answered in code examples - (2010-10-10)
[2998] Using an exception to initialise a static variable in a Python function / method - (2010-10-13)
[3177] Insurance against any errors - Volcanoes and Python - (2011-02-19)
[3433] Exceptions - a fail-safe way of trapping things that may go wrong - (2011-09-11)
[3441] Pressing ^C in a Python program. Also Progress Bar. - (2011-09-15)
[3664] Error checking in a Python program - making your program robust via exceptions - (2012-03-22)
[3913] How many times ... has this loco headed west through Tenby? - Python exceptions - (2012-11-05)
[3930] Reporting the full stack trace when you catch a Python exception - (2012-11-22)
[4029] Exception, Lambda, Generator, Slice, Dict - examples in one Python program - (2013-03-04)
[4444] Elements of an exception in Python - try, except, else, finally - (2015-02-28)
Y105 - Python - Functions, Modules and Packages [96] Variable Scope - (2004-10-22)
[105] Distance Learning - (2004-10-31)
[294] Python generator functions, lambdas, and iterators - (2005-04-28)
[303] Lambdas in Python - (2005-05-06)
[308] Call by name v call by value - (2005-05-11)
[340] Code and code maintainance efficiency - (2005-06-08)
[386] What is a callback? - (2005-07-22)
[418] Difference between import and from in Python - (2005-08-18)
[561] Python's Generator functions - (2006-01-11)
[668] Python - block insets help with documentation - (2006-04-04)
[745] Python modules. The distribution, The Cheese Shop and the Vaults of Parnassus. - (2006-06-05)
[749] Cottage industry or production line data handling methods - (2006-06-07)
[775] Do not duplicate your code - (2006-06-23)
[821] Dynamic functions and names - Python - (2006-08-03)
[900] Python - function v method - (2006-10-20)
[912] Recursion in Python - (2006-11-02)
[913] Python - A list of methods - (2006-11-03)
[949] Sludge off the mountain, and Python and PHP - (2006-11-27)
[959] It's the 1st, not the 1nd 1rd or 1th. - (2006-12-01)
[1134] Function / method parameters with * and ** in Python - (2007-04-04)
[1163] A better alternative to cutting and pasting code - (2007-04-26)
[1202] Returning multiple values from a function (Perl, PHP, Python) - (2007-05-24)
[1464] Python Script - easy examples of lots of basics - (2007-12-08)
[1784] Global - Tcl, PHP, Python - (2008-09-03)
[1790] Sharing variables with functions, but keeping them local too - Python - (2008-09-09)
[1869] Anonymous functions (lambdas) and map in Python - (2008-11-04)
[1870] What to do with a huge crop of apples - (2008-11-04)
[1871] Optional and named parameters in Python - (2008-11-05)
[1879] Dynamic code - Python - (2008-11-11)
[2011] Conversion of OSI grid references to Eastings and Northings - (2009-01-28)
[2439] Multiple returns from a function in Python - (2009-10-06)
[2440] Optional parameters to Python functions - (2009-10-07)
[2481] Sample code with errors in it on our web site - (2009-10-29)
[2506] Good example of recursion in Python - analyse an RSS feed - (2009-11-18)
[2520] Global and Enable - two misused words! - (2009-11-30)
[2718] Python - access to variables in the outer scope - (2010-04-12)
[2766] Optional and named parameters to Python functions/methods - (2010-05-15)
[2878] Program for reliability and efficiency - do not duplicate, but rather share and re-use - (2010-07-19)
[2929] Passing a variable number of parameters in to a function / method - (2010-08-20)
[3159] Returning multiple values from a function call in various languages - a comparison - (2011-02-06)
[3280] Passing parameters to Python functions - the options you have - (2011-05-07)
[3459] Catching the fishes first? - (2011-09-27)
[3464] Passing optional and named parameters to python methods - (2011-10-04)
[3472] Static variables in functions - and better ways using objects - (2011-10-10)
[3474] Python Packages - groupings of modules. An introduction - (2011-10-11)
[3662] Finding all the unique lines in a file, using Python or Perl - (2012-03-20)
[3695] Functions are first class variables in Lua and Python - (2012-04-13)
[3766] Python timing - when to use a list, and when to use a generator - (2012-06-16)
[3852] Static variables in Python? - (2012-08-29)
[3885] Default local - a good choice by the author of Python - (2012-10-08)
[3931] Optional positional and named parameters in Python - (2012-11-23)
[3945] vargs in Python - how to call a method with unknown number of parameters - (2012-12-06)
[4212] Python functions - an introduction to how they work - (2013-11-16)
[4361] Multiple yields and no loops in a Python generator? - (2014-12-22)
[4407] Python - even named code blocks are objects - (2015-01-28)
[4410] A good example of recursion - a real use in Python - (2015-02-01)
[4441] Reading command line parameters in Python - (2015-02-23)
[4448] What is the difference between a function and a method? - (2015-03-04)
[4645] What are callbacks? Why use them? An example in Python - (2016-02-11)
[4662] Recursion in Python - the classic example - (2016-03-07)
[4719] Nesting decorators - (2016-11-02)
[4722] Embedding more complex code into a named block - (2016-11-04)
[4724] From and Import in Python - where is the module loaded from? - (2016-11-06)
Some other Articles
Improving travel advise information in WiltshireMelksham Market - every TuesdayTransWilts Community Rail Partnership - formally constitutedPimms and Croquet at Well House Manor - 7th September 2013Python varables - checking existance, and call by name or by value?Bank Holiday Monday - pictures of a great train trip to WeymouthPeople WILL walk to the station in Melksham, but they need a path and trainsWedding from Well House Manor - an excellent base in MelkshamWedding Photos - Kim Ellis to Kyle Londors, 22nd August 2013A further chance to see Melksham on TV