【比較資料】Python・C++・C# におけるリスト(配列)への異なる型の格納

この資料では、整数と文字列など「異なる型」を1つのリスト(配列)に格納する方法を、Python・C++・C# の3言語で比較します。


1. Python

サンプルコード

# list_example.py
l = [1, "2"]
print(l)  # [1, '2'] と表示される

解説

  • Pythonは動的型付け言語なので、変数やリストに格納するオブジェクトの型を明示的に制限しません。
  • リストは角括弧 [] で簡単に定義でき、[1, "2"] のように整数と文字列を混在して格納できます。
  • print(l) でリストを出力すると、Pythonのリスト表記([1, '2'])のまま表示されます。

2. C++

サンプルコード

// list_example.cpp
#include <iostream>
#include <vector>
#include <variant>
#include <string>

int main() {
    // 異なる型を1つのコンテナに格納するためにstd::variantを使用
    std::vector<std::variant<int, std::string>> v;

    v.push_back(1);    // int型を追加
    v.push_back("2");  // const char* -> std::string への変換後にvariantに格納

    // 取り出しと表示
    for (auto &elem : v) {
        if (std::holds_alternative<int>(elem)) {
            std::cout << std::get<int>(elem) << " ";
        } else if (std::holds_alternative<std::string>(elem)) {
            std::cout << std::get<std::string>(elem) << " ";
        }
    }
    std::cout << std::endl;

    return 0;
}

解説

  • C++は静的型付け言語であり、vector<int> のように型を固定して宣言します。
  • 異なる型を混在して扱うためには、C++17以降で使用できる std::variant や、C++17以前であれば boost::variant などを用いる必要があります。
  • std::variant<int, std::string> のように「どの型を格納できるか」を列挙しておき、実行時には std::holds_alternative<T>()std::get<T>() で型を判別・取得します。

3. C#

サンプルコード

// list_example.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // C#も静的型付け言語だが、object型を使うことで異なる型を格納可能
        List<object> list = new List<object>();
        list.Add(1);   // int型を追加
        list.Add("2"); // string型を追加

        // 出力
        foreach (var item in list)
        {
            Console.WriteLine(item);
        }
    }
}

解説

  • C#も静的型付け言語ですが、すべてのクラスや値型の基底にあたる object 型を使用することで、異なる型を同じリストに格納できます。
  • List<object> に対して list.Add(1)list.Add("2") のように、整数・文字列などを混在して追加可能です。
  • 実行すると、各要素が順に 12 として表示されます(Console.WriteLineToString() を呼び出します)。

4. 言語間の比較まとめ

項目PythonC++C#
型システム動的型付け静的型付け静的型付け
異なる型の
リスト格納
可能(制限なし)std::variant
std::any などを使う必要あり
object 型のリストを使用
リストの宣言l = [1, "2"]std::vector<std::variant<int, std::string>> v; などList<object> list = new List<object>();
要素の追加l.append(x)v.push_back(x)list.Add(x)
出力方法print(l)std::cout << ...Console.WriteLine(...)
実行方法インタプリタ実行
(python xx.py)
コンパイル後に実行
(g++ xx.cpp -o xx./xx)
コンパイル後に実行
(csc xx.csxx.exe)

5. まとめ

  • Python
    • 動的型付け言語であるため、リストに異なる型の要素を自由に混在させることができます。宣言や型チェックの手間が少なく、短いコードで実現できるのが特徴です。
  • C++
    • 静的型付け言語であり、高速性と型安全性を重視しています。異なる型を1つのコンテナに格納する場合は、std::variant などを使用して格納可能な型を列挙し、取り出し時に型判定が必要です。
  • C#
    • 静的型付け言語ですが、object 型を利用することで、あらゆる型を1つのコレクションに格納できます。
    • ただし、object による格納はボックス化やキャストなどのオーバーヘッドが発生する可能性があり、型安全性も下がる点に注意が必要です。
    • 必要に応じてジェネリックや dynamic を活用する選択肢もあります。

以上が、Python・C++・C# における「異なる型を同一のリスト(配列)に格納する」方法の比較となります。各言語の特性に応じて、適切な手法を選択してください。

C#

Posted by hidepon