ローカル変数とグローバル変数の違いを日本一わかりやすく解説

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks

ローカル変数とグローバル変数とは?

プログラミングにおける変数には、どこで使えるかという「スコープ」という概念があります。これを家に例えると、ローカル変数は個人の部屋にある物グローバル変数は家族全員が使えるリビングにある物と考えるとわかりやすいでしょう。

基本的な違い

ローカル変数

  • 特定の関数やブロック内でのみ使用可能
  • その範囲を出ると消える
  • 他の部分からはアクセスできない

グローバル変数

  • プログラム全体のどこからでもアクセス可能
  • プログラム実行中はずっと存在する
  • どの関数からでも読み書きできる

超簡単な例で理解しよう

JavaScript での例

let globalVar = "みんなで使える"; // グローバル変数

function myFunction() {
    let localVar = "この中だけ"; // ローカル変数
    console.log(globalVar);  // OK:グローバル変数は使える
    console.log(localVar);   // OK:ローカル変数も使える
}

console.log(globalVar);  // OK:グローバル変数は外でも使える
console.log(localVar);   // エラー:ローカル変数は外では使えない

Python での例

global_var = "どこでも使える"  # グローバル変数

def my_function():
    local_var = "ここだけ"  # ローカル変数
    print(global_var)  # OK
    print(local_var)   # OK

print(global_var)  # OK
print(local_var)   # エラー:NameError

Java での例

public class Example {
    static String globalVar = "クラス全体で使える"; // グローバル変数
    
    public static void myMethod() {
        String localVar = "メソッド内だけ"; // ローカル変数
        System.out.println(globalVar);  // OK
        System.out.println(localVar);   // OK
    }
    
    public static void main(String[] args) {
        System.out.println(globalVar);  // OK
        // System.out.println(localVar); // エラー:使えない
    }
}

スコープ(有効範囲)を図で理解

🏠 プログラム全体
├── 🌍 グローバル変数(どこでも使える)
├── 📦 関数A
│   └── 🏠 ローカル変数A(関数A内だけ)
├── 📦 関数B  
│   └── 🏠 ローカル変数B(関数B内だけ)
└── 📦 関数C
    └── 🏠 ローカル変数C(関数C内だけ)

各言語での詳細な例

C言語での例

#include <stdio.h>

int global_num = 100; // グローバル変数

void function1() {
    int local_num = 10; // ローカル変数
    printf("関数1:%d, %d\n", global_num, local_num);
}

void function2() {
    int local_num = 20; // 別のローカル変数(同じ名前でもOK)
    printf("関数2:%d, %d\n", global_num, local_num);
}

int main() {
    printf("メイン:%d\n", global_num);
    function1(); // 出力:100, 10
    function2(); // 出力:100, 20
    return 0;
}

C++での例

#include <iostream>
using namespace std;

int global_count = 0; // グローバル変数

void increment() {
    int local_step = 1; // ローカル変数
    global_count += local_step;
}

int main() {
    cout << "初期値:" << global_count << endl; // 0
    increment();
    cout << "実行後:" << global_count << endl; // 1
    return 0;
}

C#での例

using System;

class Program {
    static int globalValue = 50; // グローバル変数
    
    static void ShowValues() {
        int localValue = 25; // ローカル変数
        Console.WriteLine($"グローバル:{globalValue}");
        Console.WriteLine($"ローカル:{localValue}");
    }
    
    static void Main() {
        Console.WriteLine($"メイン:{globalValue}");
        ShowValues();
    }
}

PHP での例

<?php
$globalVar = "PHP全体"; // グローバル変数

function testFunction() {
    global $globalVar; // グローバル変数を使う宣言
    $localVar = "関数内"; // ローカル変数
    
    echo $globalVar . "\n"; // OK
    echo $localVar . "\n";  // OK
}

echo $globalVar . "\n"; // OK
testFunction();
// echo $localVar; // エラー:Undefined variable
?>

よくある間違いパターン

パターン1:ローカル変数を外で使おうとする

function calculate() {
    let result = 10 + 20; // ローカル変数
}

calculate();
console.log(result); // エラー:resultは定義されていません

正しい書き方

function calculate() {
    let result = 10 + 20;
    return result; // 戻り値として返す
}

let answer = calculate();
console.log(answer); // 30

パターン2:同じ名前の変数の混同

name = "グローバル太郎"  # グローバル変数

def greet():
    name = "ローカル花子"  # ローカル変数(別の変数)
    print(f"こんにちは、{name}さん")  # ローカル花子

greet()  # ローカル花子
print(f"名前は{name}です")  # グローバル太郎

パターン3:グローバル変数の意図しない変更

let counter = 0; // グローバル変数

function badFunction() {
    counter = 100; // グローバル変数を変更してしまう
}

console.log(counter); // 0
badFunction();
console.log(counter); // 100(予想外の変更!)

ブロックスコープとは?

JavaScript のブロックスコープ

if (true) {
    let blockVar = "ブロック内"; // ブロックスコープ
    var functionVar = "関数内"; // 関数スコープ
}

// console.log(blockVar); // エラー:アクセスできない
console.log(functionVar); // OK:varは関数スコープ

Java のブロックスコープ

public static void main(String[] args) {
    if (true) {
        int blockNum = 10; // ブロック内でのみ有効
        System.out.println(blockNum); // OK
    }
    // System.out.println(blockNum); // エラー:スコープ外
}

実践的な使い分け

良い例:適切な使い分け

# 設定値はグローバル変数
MAX_USERS = 100
DATABASE_URL = "localhost:5432"

def process_user(user_data):
    # 処理用の変数はローカル変数
    processed_name = user_data["name"].upper()
    processed_age = int(user_data["age"])
    
    # グローバル変数は参照のみ
    if len(get_all_users()) >= MAX_USERS:
        return "ユーザー数上限"
    
    return save_user(processed_name, processed_age)

def get_all_users():
    # データベース処理
    pass

def save_user(name, age):
    # 保存処理
    pass

悪い例:グローバル変数の乱用

# 悪い例:何でもグローバル変数
user_name = ""
user_age = 0
result_message = ""
temp_data = ""

def bad_function():
    global user_name, user_age, result_message, temp_data
    # グローバル変数をあちこちで変更(混乱の元)
    user_name = temp_data.upper()
    user_age = int(temp_data)
    result_message = "処理完了"

メモリとパフォーマンスの違い

メモリ使用量

ローカル変数

  • 関数実行時に作成
  • 関数終了時に自動削除
  • メモリ効率が良い

グローバル変数

  • プログラム開始時に作成
  • プログラム終了まで残存
  • メモリを占有し続ける

パフォーマンス比較

// グローバル変数(少し遅い)
let globalSum = 0;

function addGlobal(arr) {
    for (let i = 0; i < arr.length; i++) {
        globalSum += arr[i];
    }
}

// ローカル変数(速い)
function addLocal(arr) {
    let localSum = 0; // ローカル変数
    for (let i = 0; i < arr.length; i++) {
        localSum += arr[i];
    }
    return localSum;
}

デバッグとトラブルシューティング

変数の値を確認する方法

let globalDebug = "グローバル値";

function debugFunction() {
    let localDebug = "ローカル値";
    
    // デバッグ出力
    console.log("グローバル変数:", globalDebug);
    console.log("ローカル変数:", localDebug);
    
    // ブラウザのデベロッパーツールで確認
    debugger; // ここで実行が一時停止
}

よくあるエラーメッセージ

JavaScript

  • ReferenceError: localVar is not defined
  • 意味:ローカル変数をスコープ外で使おうとした

Python

  • NameError: name 'localVar' is not defined
  • 意味:定義されていない変数を使おうとした

Java

  • cannot find symbol variable localVar
  • 意味:変数が見つからない(スコープ外)

ベストプラクティス

推奨される使い方

# 設定・定数 → グローバル変数
APP_NAME = "マイアプリ"
VERSION = "1.0.0"
DEFAULT_TIMEOUT = 30

# 関数内の処理 → ローカル変数
def process_data(input_data):
    # ローカル変数で処理
    cleaned_data = input_data.strip()
    result_count = len(cleaned_data)
    
    # 戻り値で結果を返す
    return {
        "data": cleaned_data,
        "count": result_count,
        "app": APP_NAME  # グローバル変数は参照のみ
    }

避けるべきパターン

// 悪い例:グローバル変数での値のやり取り
let sharedData = "";
let sharedResult = "";

function badFunction1() {
    sharedData = "データ";  // グローバル変数に値を設定
}

function badFunction2() {
    sharedResult = sharedData + "処理済み";  // グローバル変数から取得
}

// 良い例:引数と戻り値を使用
function goodFunction1() {
    return "データ";  // 戻り値で返す
}

function goodFunction2(data) {
    return data + "処理済み";  // 引数で受け取り、戻り値で返す
}

実際の開発での活用例

Web開発での例

// グローバル変数:設定値
const API_BASE_URL = "https://api.example.com";
const MAX_RETRY_COUNT = 3;

// ローカル変数:処理用
async function fetchUserData(userId) {
    let retryCount = 0;  // ローカル変数
    let userData = null;  // ローカル変数
    
    while (retryCount < MAX_RETRY_COUNT) {  // グローバル変数を参照
        try {
            const response = await fetch(`${API_BASE_URL}/users/${userId}`);
            userData = await response.json();
            break;
        } catch (error) {
            retryCount++;
        }
    }
    
    return userData;  // ローカル変数を戻り値として返す
}

ゲーム開発での例

# グローバル変数:ゲーム設定
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
MAX_LIVES = 3

class Player:
    def __init__(self):
        self.lives = MAX_LIVES  # グローバル定数を使用
    
    def move(self, dx, dy):
        # ローカル変数:計算用
        new_x = self.x + dx
        new_y = self.y + dy
        
        # 画面内に収める(グローバル定数を使用)
        new_x = max(0, min(new_x, SCREEN_WIDTH))
        new_y = max(0, min(new_y, SCREEN_HEIGHT))
        
        self.x = new_x
        self.y = new_y

まとめ:いつ何を使うべきか

ローカル変数を使うべき場面

  • 関数内での一時的な計算
  • ループのカウンター
  • 関数固有のデータ処理
  • ほとんどの場合はローカル変数を選ぶ

グローバル変数を使うべき場面

  • アプリケーション設定値
  • 定数(変更しない値)
  • 複数の関数で共有する必要がある状態
  • 必要最小限に留める

覚えておくべき重要ポイント

  1. 迷ったらローカル変数を選ぶ
  2. グローバル変数は必要最小限
  3. 定数はグローバル変数でOK
  4. 関数の戻り値でデータをやり取りする
  5. デバッグ時はスコープを意識する

ローカル変数とグローバル変数の違いを理解することで、バグが少なく、保守しやすいプログラムを書けるようになります。最初は混乱するかもしれませんが、たくさん練習すれば必ず身につきます!

らくらくPython塾 – 読むだけでマスター

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks