REW

Can You Redeclare A Variable?

Published Aug 29, 2025 4 min read
On this page

Yes, whether or not you can redeclare a variable depends entirely on the programming language and the specific keyword used for the initial declaration.

Redeclaring a variable is distinct from reassigning it. Redeclaration means defining the variable again, often with the same name, while reassignment simply changes the value of an existing variable.

Language-specific rules for redeclaration

The ability to redeclare a variable is not a universal feature but a language-specific one, as highlighted below.

JavaScript

JavaScript has evolved significantly regarding variable declaration, with three keywords governing different rules.

  • var: Variables declared with var can be redeclared and reassigned within the same scope. This older behavior, a frequent source of bugs, is one reason newer declaration keywords were introduced.javascript

    var x = 10;
    var x = 20; // This is a valid redeclaration
    console.log(x); // Output: 20
    

    Use code with caution.

  • let: Introduced in ES6, let provides block-scoping and prevents redeclaration within the same scope. Attempting to redeclare a let variable will result in a SyntaxError.javascript

    let y = 10;
    // let y = 20; // This throws a SyntaxError
    y = 20; // This is a valid reassignment
    console.log(y); // Output: 20
    

    Use code with caution.

  • const: Also from ES6, const is used for variables whose values are intended to be constant. A const variable cannot be redeclared or reassigned.javascript

    const z = 10;
    // const z = 20; // Throws a SyntaxError
    // z = 20; // Throws a TypeError
    

    Use code with caution.

Python

In Python, variable names are simply labels for values, and variables are dynamically typed. This means you can "redeclare" a variable by reassigning a new value to it, even with a different data type. This is, in effect, a reassignment that updates the reference to a new object.

x = 10      # x refers to an integer
x = "hello" # x now refers to a string
print(x)    # Output: hello

Use code with caution.

There is no concept of a separate "declaration" and "assignment" step like in statically typed languages; a variable is created the moment a value is assigned to it.

C and C++

C and C++ are statically typed languages where variables must be declared with a type before use.

  • Same Scope: In the same scope (e.g., within the same function block {}), you cannot redeclare a variable. Doing so will cause a compile-time error.cpp

    #include <iostream>
    int main() {
        int x = 10;
        // int x = 20; // This is a compile-time error
        x = 20; // This is a valid reassignment
        std::cout << x << std::endl;
        return 0;
    }
    

    Use code with caution.

  • Different Scopes: A variable can be redeclared in a nested or different scope, a process known as "shadowing." The inner variable shadows, or hides, the outer one.cpp

    #include <iostream>
    int main() {
        int x = 10;
        std::cout << "Outer x: " << x << std::endl; // Outer x: 10
        {
            int x = 20; // A new variable 'x' is declared in the inner scope
            std::cout << "Inner x: " << x << std::endl; // Inner x: 20
        }
        std::cout << "Outer x again: " << x << std::endl; // Outer x again: 10
        return 0;
    }
    

    Use code with caution.

Go

Go allows "short variable redeclarations" in specific circumstances. A short declaration (:=) can redeclare variables within the same block, provided at least one new variable is being declared in the statement.

package main
import "fmt"
func main() {
    a, err := doSomething() // 'a' and 'err' are declared
    if err != nil {
        return
    }
    b, err := doAnotherThing() // 'b' is new, 'err' is redeclared
    if err != nil {
        return
    }
    fmt.Println(a, b, err)
}
func doSomething() (int, error) { return 1, nil }
func doAnotherThing() (int, error) { return 2, nil }

Use code with caution.

Redeclaration vs. Reassignment: The fundamental difference

The core of this topic lies in understanding the distinction between redeclaration and reassignment.

  • Declaration: The act of introducing a new variable name into a program's scope.
  • Assignment: The act of giving a value to an existing variable.
  • Redeclaration: The act of declaring an identifier that has already been declared.
  • Reassignment: The act of changing the value of a variable that has already been assigned.

Languages like JavaScript with var permit both redeclaration and reassignment, while modern practices with let and const restrict this behavior. Statically typed languages like C++ strictly separate declaration from assignment and do not permit redeclaration in the same scope, though reassignment is standard. Dynamically typed languages like Python don't technically have redeclaration, but reassignment with a different type has a similar effect.

Best practices and risks

Relying on redeclaration can be problematic and is generally discouraged, even in languages where it's possible.

  • Clarity: Code that avoids redeclaration is easier to read and understand. It makes the flow of variable values more explicit.
  • Preventing bugs: Redeclaring a variable can lead to accidental overwriting of data. This is why let and const were introduced to JavaScript, as they prevent this behavior.
  • Scope issues: When redeclaring a variable in a different scope, you are creating a new variable that shadows the previous one. This can lead to confusion about which variable is being accessed at any given point.

The most robust and readable coding practice is to:

  • Declare each variable only once per scope.
  • Use a consistent variable name throughout its lifecycle.
  • Change the variable's value through reassignment, not redeclaration.
  • Use a new variable name when you need to represent a different concept or value within a different scope.
Enjoyed this article? Share it with a friend.