Pythonを学んでいると、毎年秋に新しいバージョンが出ることに気づきます。
今年やってくるのはPython 3.15です。正式リリースは2026年10月1日が予定されていて、いまはその直前のテスト期間にあたります。
新しいバージョンと聞くと、少し身構えてしまう方も多いのではないでしょうか。覚えることがまた増えるのかと思うと、正直しんどい気持ちにもなりますよね。
でも安心してください。3.15の変更は、これから書くコードをむしろ楽にしてくれるものが中心です。
この記事では、Python 3.15で何が変わるのかを、IT初心者の方にもわかるようにかみ砕いて解説します。実際に動かせるサンプルコードと、今から試す方法もあわせて紹介していきます。
Python 3.15はいつ出るの?¶
まずはスケジュールを押さえておきましょう。Pythonには毎年10月に新しいバージョンを出すというリズムがあります。
3.15も同じで、2026年10月1日に正式版が公開される予定です。そこまでの流れを表にまとめました。
| 時期 | 何が起きるか | 学習者から見た意味 |
|---|---|---|
| 2026年5月7日 | ベータ1が公開 | 新機能の追加はここで終了 |
| 2026年7月18日 | ベータ4が公開 | 細かい調整とバグ修正が続く |
| 2026年8月4日 | 候補版(rc1)の公開予定 | ほぼ完成版。修正は最小限になる |
| 2026年9月1日 | 候補版(rc2)の公開予定 | 最終確認の段階 |
| 2026年10月1日 | 3.15.0 正式版の公開予定 | 安心して使い始められる |
つまり今は、新機能がほぼ確定して仕上げに入っている時期です。だからこそ、先に中身を知っておく価値があります。
ひとつ前のバージョンの話は、以下の記事でも解説しています。
【関連記事】Python 3.14ベータが始動!新機能について解説します。
3.15の新機能をざっくり把握する¶
細かい話に入る前に、全体像を見ておきましょう。3.15にはかなり多くの変更が入りますが、初心者が知っておくとよいのは次のあたりです。
| 新機能 | 何ができるようになるか | 初心者への影響度 |
|---|---|---|
| lazy import | 使うときまでモジュールの読み込みを遅らせる | 中:起動が速くなる |
| frozendict | 書き換えできない辞書を標準で使える | 中:安全なコードが書ける |
| sentinel | 特別な目印用のオブジェクトを作れる | 小:まずは知るだけでよい |
| 内包表記のアンパック | 入れ子のリストを1行で平らにできる | 大:書き方が素直になる |
| UTF-8がデフォルト | 文字コードの指定なしでもUTF-8になる | 大:文字化けが減る |
| 新しいプロファイラ | 処理の遅い場所を測りやすくなる | 小:中級者向け |
| Windows版の高速化 | 同じコードがそのまま速くなる | 中:うれしいだけ |
一気に見ると多く感じますが、順番に見ていけば難しくありません。ひとつずつ、実際のコードで確認していきましょう。
lazy import:使うまで読み込まない新しい書き方¶
3.15でいちばん話題になっているのが、遅延インポートです。PEP 810という提案で採用され、lazyという新しいキーワードが使えるようになります。
まずは何が問題だったのかを整理しましょう。Pythonはファイルの先頭に書いたimportを、プログラムの起動時にすべて実行します。
そのため、実際には使わなかったモジュールの読み込み時間まで毎回払うことになります。小さな学習用スクリプトなら気になりませんが、規模が大きくなると起動の遅さとして表に出てきます。
書き方はとてもシンプル¶
新しい書き方は、いつものimportの前にlazyを付けるだけです。
lazy import json
lazy from pathlib import Path
print("起動しました") # ここではまだjsonもpathlibも読み込まれていない
data = json.loads('{"key": "value"}') # 最初に使うこの瞬間に読み込まれる
p = Path(".")
lazyを付けたモジュールは、その名前を最初に使ったときに読み込まれます。それまでは軽い代理オブジェクトが置かれているだけです。
うれしいのは、コードの見た目がほとんど変わらない点です。importを関数の中に押し込むという苦しい書き方をしなくても、先頭にまとめて書いたまま起動を速くできます。
使える場所には制限がある¶
便利な機能ですが、どこでも使えるわけではありません。ここは知らないとつまずくところです。
lazyはモジュールの一番外側でしか書けません。関数の中、クラスの定義の中、tryやexceptの中で使うとSyntaxErrorになります。
また、lazy from module import *のようなスター付きのインポートや、from __future__ import ...も遅延にはできません。
もうひとつ覚えておきたいのが、エラーが出るタイミングの変化です。存在しないモジュールをlazyで書いた場合、エラーはimportの行ではなく、その名前を最初に使った場所で発生します。
つまり、ModuleNotFoundErrorに出会う場所が変わるということです。エラーの本文には、名前を使った場所と元のimport文の両方が表示されるので、慣れれば追いかけられます。
なお、コードを書き換えずにまとめて遅延化したいときは、起動時のオプション-X lazy_importsや環境変数PYTHON_LAZY_IMPORTSも用意されています。まずはlazyキーワードだけ覚えておけば十分です。
frozendict:書き換えられない辞書が標準になる¶
次は辞書の話です。3.15では、変更できない辞書であるfrozendictが組み込み型として追加されます。
リストに対するタプルのような関係だと考えるとイメージしやすいと思います。作ったあとに中身を書き換えられません。
setting = frozendict(host="localhost", port=8000)
print(setting["host"]) # localhost
setting["port"] = 3000
# TypeError: 'frozendict' object does not support item assignment
書き換えようとするとTypeErrorになります。設定値のように、途中で変わってほしくないデータを守るのに向いています。
さらに、キーと値がすべてハッシュ可能であれば、frozendict自体もハッシュ可能です。つまり辞書を集合の要素や別の辞書のキーにできます。
a = frozendict(x=1, y=2)
b = frozendict(y=2, x=1)
print(hash(a) == hash(b)) # True
print(a == b) # True
並び順は作ったときのまま保たれますが、比較では順番を見ません。上の例のように、書いた順が違っても等しいと判定されます。
dictの仲間ではない点に注意¶
ひとつだけ気をつけたい仕様があります。frozendictはdictを継承していません。objectを直接継承した別の型です。
そのためisinstance(値, dict)という判定はFalseになります。両方を受け取りたいときはisinstance(値, (dict, frozendict))のように書きます。
私が実務で辞書を扱うとき、いちばん怖いのは知らないうちに中身が書き換わることです。関数に渡した辞書が呼び出し先で更新され、原因を追うのに時間を取られた経験は何度もあります。
そういう事故を型のレベルで防げるのは、地味ですがかなりありがたい変更です。辞書でつまずきやすいポイントは、以下の記事でも取り上げています。
【関連記事】PythonでKeyErrorが出る理由とは?辞書dictで初心者がハマるポイント
内包表記でアンパックが使えるようになる¶
初心者にとって一番うれしいのは、この変更かもしれません。リスト内包表記などで*と**が使えるようになります。
入れ子になったリストを平らにする処理を思い出してください。これまでは二重のループを書く必要がありました。
lists = [[1, 2], [3, 4], [5]]
# 3.14まで
print([x for L in lists for x in L]) # [1, 2, 3, 4, 5]
# 3.15から
print([*L for L in lists]) # [1, 2, 3, 4, 5]
forが2つ並ぶ書き方は、初心者がかなり戸惑うところです。新しい書き方なら、中身を展開したいという意図がそのまま読み取れます。
辞書でも同じことができます。複数の辞書をひとつにまとめる処理が短く書けます。
dicts = [{"a": 1}, {"b": 2}, {"a": 3}]
print({**d for d in dicts}) # {'a': 3, 'b': 2}
内包表記そのものが不安な方は、先に基本を固めておくと理解が早くなります。
【関連記事】Pythonのリスト内包表記を使いこなせ!3行のループを1行にまとめる書き方
UTF-8がデフォルトになる¶
日本語を扱う私たちにとって、実は影響がいちばん大きいのがこの変更です。3.15からは、Pythonの既定の文字コードがUTF-8になります。
これまでは、open()にencodingを書かないと、動かしている環境の設定に従っていました。そのためWindowsでUTF-8のファイルをそのまま開くと、文字化けやUnicodeDecodeErrorに出会うことがありました。
# 3.15からは、この書き方でもUTF-8として読み込まれる
with open("memo.txt") as f:
print(f.read())
同じコードがWindowsでもMacでも同じように動く。これは学習中の人にとって、かなり大きな安心につながります。
それでもencodingは書いたほうがいい¶
ただし、今日から書くコードではencoding="utf-8"を明示するのがおすすめです。古いバージョンのPythonでも同じ結果になるからです。
with open("memo.txt", encoding="utf-8") as f:
print(f.read())
私は10年ほどエンジニアとして開発に関わってきましたが、文字化けの調査はいまだに面倒な作業のひとつです。原因がコードではなく実行環境にあると、再現に手間がかかるからです。
だからこそ、明示できるものは明示しておく。この習慣は3.15以降も持っておいて損はありません。
なお、これまでの動きに戻したい場合は、環境変数PYTHONUTF8=0や起動オプション-X utf8=0で無効化できます。
速度とエラーメッセージも進化する¶
新機能ではありませんが、体感につながる改善も入っています。まずは速度です。
Windowsの64bit版が、Visual Studio 2026の新しい仕組みを使った作りに変わります。公式の説明では、性能測定の平均で15〜20%ほど速くなったと報告されています。
コードを1文字も変えずに速くなるのですから、これはうれしい話ですよね。あわせてJITコンパイラの改良も進んでいて、公式の測定では平均8〜9%の改善が報告されています。
エラーメッセージの改善も続いています。3.15では、属性を間違えたときに、内側のオブジェクトを経由すればよいと教えてくれる場面が増えました。
さらにpython --helpの表示など、いろいろな場所でカラー表示が広がります。初心者にとって、読みやすさは学習効率に直結する部分です。
今から試すにはどうすればいい?¶
気になったら、実際に触ってみるのがいちばん早いです。とはいえ、普段使っているPythonを置き換えるのはおすすめしません。
安全なのは、複数のバージョンを共存させる方法です。学習用の環境とは別に3.15を入れて、動作を確かめるだけにしておきます。
バージョンを切り替える手順は、以下の記事で詳しく解説しています。
【関連記事】pyenvの使い方をわかりやすく解説!Pythonのバージョンを変える
学習中の人はどこまで気にすればいい?¶
正直に言うと、いま学習中の方が3.15を急いで追う必要はありません。基礎の文法は3.14でも3.15でも変わらないからです。
私自身、実務で新しいバージョンを採用するときは、正式リリースから少し様子を見ます。使っているライブラリが追いついているかを確認してからでないと、思わぬところで止まるからです。
では、なぜ知っておく価値があるのでしょうか。理由は、Pythonがどこへ向かっているのかが見えるからです。
起動を速くする、書き換え事故を防ぐ、環境の違いをなくす。3.15の変更を並べると、Pythonが実務での使いやすさを大事にしていることが伝わってきます。
そういう視点を持って学ぶと、文法の暗記が目的ではなくなります。学習のモチベーションが続きやすくなるのは、この感覚を持てたときだと感じています。
まとめ¶
Python 3.15は2026年10月1日に正式リリースが予定されているバージョンです。
注目はlazyによる遅延インポート、書き換えできないfrozendict、内包表記でのアンパック、そしてUTF-8のデフォルト化です。
どれも派手な文法追加ではありません。けれど、起動の速さや文字化けのような、実際に困っていた部分に手が入っています。
初心者の方は、まず名前と役割だけ知っておけば十分です。そのうえでencoding="utf-8"を書く習慣だけ先に身につけておくと、バージョンが変わっても迷いません。
新しいバージョンの情報は、Pythonという言語の設計思想を知る入口にもなります。今日の記事で気になった機能があれば、リリース後にぜひ自分の手で動かしてみてください。
ここまでお読みいただきありがとうございました。