Variable shadowing
   HOME

TheInfoList



OR:

In
computer programming Computer programming or coding is the composition of sequences of instructions, called computer program, programs, that computers can follow to perform tasks. It involves designing and implementing algorithms, step-by-step specifications of proc ...
, variable shadowing occurs when a variable declared within a certain scope (decision block, method, or inner class) has the same name as a variable declared in an outer scope. At the level of
identifiers An identifier is a name that identifies (that is, labels the identity of) either a unique object or a unique ''class'' of objects, where the "object" or class may be an idea, person, physical countable object (or class thereof), or physical mass ...
(names, rather than variables), this is known as name masking. This outer variable is said to be shadowed by the inner variable, while the inner identifier is said to ''mask'' the outer identifier. This can lead to confusion, as it may be unclear which variable subsequent uses of the shadowed variable name refer to, which depends on the name resolution rules of the language. One of the first languages to introduce variable shadowing was
ALGOL ALGOL (; short for "Algorithmic Language") is a family of imperative computer programming languages originally developed in 1958. ALGOL heavily influenced many other languages and was the standard method for algorithm description used by the ...
, which first introduced blocks to establish scopes. It was also permitted by many of the derivative programming languages including C, C++ and
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
. The C# language breaks this tradition, allowing variable shadowing between an inner and an outer class, and between a method and its containing class, but not between an if-block and its containing method, or between case statements in a
switch In electrical engineering, a switch is an electrical component that can disconnect or connect the conducting path in an electrical circuit, interrupting the electric current or diverting it from one conductor to another. The most common type o ...
block. Some languages allow variable shadowing in more cases than others. For example Kotlin allows an inner variable in a function to shadow a passed argument and a variable in an inner block to shadow another in an outer block, while
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
does not allow these. Both languages allow a passed argument to a function/Method to shadow a Class Field. Some languages disallow variable shadowing completely such as
CoffeeScript CoffeeScript is a programming language that compiles to JavaScript. It adds syntactic sugar inspired by Ruby, Python, and Haskell in an effort to enhance JavaScript's brevity and readability. Some added features include list comprehension an ...
and V (Vlang).


Example


Lua

The following Lua code provides an example of variable shadowing, in multiple blocks. v = 1 -- a global variable do local v = v + 1 -- a new local that shadows global v print(v) -- prints 2 do local v = v * 2 -- another local that shadows outer local v print(v) -- prints 4 end print(v) -- prints 2 end print(v) -- prints 1


Python

The following Python code provides another example of variable shadowing: x = 0 def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # prints # inner: 2 # outer: 1 # global: 0 As there is no variable declaration but only variable assignment in Python, the keyword nonlocal introduced in Python 3 is used to avoid variable shadowing and assign to non-local variables: x = 0 def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # prints # inner: 2 # outer: 2 # global: 0 The keyword global is used to avoid variable shadowing and assign to global variables: x = 0 def outer(): x = 1 def inner(): global x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # prints # inner: 2 # outer: 1 # global: 2


Rust

fn main() //# Inner x: 1 //# Outer x: 0 //# Outer x: Rust


C++

#include int main()


Java

public class Shadow


JavaScript

ECMAScript 6 introduction of let and const with block scoping allow variable shadowing. function myFunc() myFunc();


See also

* Overloading * Type polymorphism *
Name binding In programming languages, name binding is the association of entities (data and/or code) with identifiers. An identifier bound to an object is said to reference that object. Machine languages have no built-in notion of identifiers, but name-ob ...


References

{{Reflist Variable (computer science) Programming language comparisons Articles with example C++ code Articles with example Java code Articles with example JavaScript code Articles with example Python (programming language) code Articles with example Rust code