Code Fix

初級

SyntaxError: invalid syntax(if x = 5:)の原因と直し方

条件式の中で = (代入)を使おうとしたときに出るエラーです。比較には == を使います。

エラーメッセージの読み方

  File "main.py", line 2
main.py
ファイル名
2
行番号 — Pythonが構文解析を諦めた位置
SyntaxError
エラークラス — 実行前の構文チェックで検出されました
invalid syntax. Maybe you meant '==' or ':=' instead of '='?
内容 — 期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  x = 5
 2  if x =   5:
          ^
 3      print("yes")
File "main.py", line 2 if x = 5: ^^^^^ SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

=は代入、==は比較です。Pythonでは代入を式の中で使えないため、比較のつもりで=を書くとその場で構文エラーになります。

直し方: = を == にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  y = 10
 2  while y =  0:
             ^
 3      print(y)
File "main.py", line 2 while y = 0: ^^^^^ SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

whileの条件式でも同じ規則です。構文エラーなので、ループの回数に関わらず実行すら始まりません。

直し方: = を == にします。

この問題を解いてみる →

パターン3

 1  flag = True
 2  if flag =  False:
             ^
 3      print("no")
File "main.py", line 2 if flag = False: ^^^^^^^^^^^^ SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

bool型でも同じです。=を使うと値の型に関わらず必ず構文エラーになります。

直し方: = を == にします。

この問題を解いてみる →

パターン4

 1  x = 5
 2  if x > 10:
 3      print("big")
 4  elif x =  5:
            ^
 5      print("exact")
File "main.py", line 4 elif x = 5: ^^^^^ SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

elifの条件式でも同じ規則です。=を使うと、そこで構文エラーになりifブロック自体が実行されません。

直し方: = を == にします。

この問題を解いてみる →

パターン5

 1  name = "admin"
 2  if name =  "admin":
             ^
 3      print("ok")
File "main.py", line 2 if name = "admin": ^^^^^^^^^^^^^^ SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

文字列同士の比較でも同じです。値の型に関わらず、=は比較の位置には使えません。

直し方: = を == にします。

この問題を解いてみる →

よくある誤解

1文字の書き間違いですが、Pythonは代入を式の中で使えない設計になっているため、その場で構文エラーとして検出されます。C言語のように「代入した値で比較され、意図せず真になる」という事故は起きません。

実務での勘所

「Pythonは式の中で代入を使えない」という説明は、正確には2018年のPython 3.8より前の話です。PEP 572で導入された海象演算子(:=)を使えば、if (n := len(data)) > 10:のように、代入と条件判定を1つの式の中で意図的に行えます。ただし=とは別の記号を新設したのは、既存の=をそのまま条件式で使えるようにするとC言語と同じ事故が起きるためで、「意図して式の中で代入したいときだけ、明示的に別の記号を使う」という設計判断です。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)