info exists tests whether a variable exists and is defined.
Returns 1 if the variable named varName exists in the current context according the the rules of name resolution, and has been defined by being given a value, returns 0 otherwise. To check whether a variable exists precisely in a certain namespace, fully-qualify the variable name.
info exists returns 0 for variables that exist but are undefined. This can happen, for example, with trace, because if a trace is set on a nonexisting variable, trace will create that variable, but leave it undefined. Although info exists doesn't detect undefined variables, namespace which -variable does. In that case, it's usually a good idea to pass a fully-qualified variable name to namespace which -variable.
Examples:
info exists a # -> 0 set a 1 # -> 1 info exists a # -> 1 info exists b # -> 0 set b(2) 2 # -> 2 info exists b # -> 1 info exists b(1) # -> 0 info exists b(2) # -> 1 info exists $a # -> 0
That last command is an example of a common mistake: using $varname instead of just varname. Since the value of $a is 1, the command is asking if a variable named 1 exists.
It can be useful to store the name of a variable in another variable:
foreach var {a b c} { if {[info exists $var]} { puts "$var does indeed exist" } else { puts "$var sadly does not exist" } }
KPV: Another thing to keep in mind is that linking variable with upvar can do funny things with the existence of variables.
% set a 1 1 % upvar #0 a b % info exists b 1 % unset a % info exists b 0 % set a 1 1 % info exists b 1
2015-12-01 info exists allows for the following typo to go on undetected for a while:
if {[info exists ARRAY(KEY]} { # note the missing ')' in the array variable name. # ... }
AM 2015-12-01 That is a consequence of the incredible freedom you have in using variable names. The above checks for a variable "ARRAY(KEY", not an element of the array ARRAY. You can set that variable and get its value like:
set ARRAY(KEY 1 puts ${ARRAY(KEY}
Note the braces around the name - otherwise you would get a syntax error as the name is not composed of just letters and digits and underscores.
VI 2003-12-21: I remember reading that info exists is slow on some versions of Tcl on large arrays. Anybody have more info on that?
DKF 2007-12-29: From 8.5 onwards, info exists is byte-compiled.