A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
文字通りの回答は、すでにあるとおりですが、
おそらく、
print = "xxx"
~~~~
print("OK")
のようなコードを書いて、「何故 print = "xxx" の時点でエラーにしないのか?」と言うことかと思います。
print = "xxx" と書いた変数スコープの範囲内で、標準のprint関数を一切使わないのであれば、何の問題もありません。print という名前は abc などと同じく変数名として扱われます。
print ="xxx"
sys.stdout.write(print)
は全く正当なプログラムです。望ましい書き方かどうかは別の話。
「同じ名前を別の意味に使ってはいけない」というか「同じ名前なら同じ物として扱われる」(変数のスコープは考慮の上で)というだけです。
例えば address という変数名は「住所」なのか「メールアドレス」なのかどっちの意味で使っているか(あるいはそれ以外の意味)を全く意識しないでプログラムを書くと、「住所欄にメールアドレスが表示される!?」的なエラーが起こったり、変数に型のある言語だと、型の不一致のエラーが出たりするかと思いますが、それと同じレベルの話です。
上記のコードを
printx ="xxx"
sys.stdout.write(printx)
と書いたとすると、これは仮に「標準関数名は全て予約語」でも今は正しいプログラムです。が、今後のPythonのバージョンアップで printx という標準関数が増えた場合、printxも予約語になり、今まで正しかったエラーになってしまいます。こういう事を防ぐために、予約語は必要最低限にされています。
言語によっては、「今は何の意味も無い(書くとエラー)が、将来の言語仕様のバージョンアップで使うかも知れないので、今のうちから予約語にしておくので、これらの名前は使うな」という言語もあります。
JavaScriptだとこれ。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
また、言語によっては予約語が一切無い言語もあります。構文で文法的キーワードなのか、変数名/関数名なのか判断します。有名どころではFortranがそうです。FortanやPI/Iといった昔の言語には予約語がないものがいくつかあります。
if(a) x=1 ・・・条件がaであるif文。真なら変数xに1が代入される
if(a) =1 ・・・ifという名前の配列変数の添え字aの箇所に1を代入
No.6
- 回答日時:
面白い質問だわ。
マジで。ただ、答えにくい質問で、
> 何故ですか。
って訊かれたら
「その言語の設計者がそう決めたから」
としか答えようがない質問の類、なのね。
つまり、実の事を言うと、
「予約語として何を含めるべきか」
と言う明解な指針、っつーか「理論」って別に無いんだよ。
とある言語Aの設計者が「何かを予約語に定めました」としても、別の言語Bの設計者が「それを予約語にしない」って事はあり得るし、あり得ていいわけ。
そして言っちゃえば、「予約語は必ず言語設計に必要なモノ」ってモンでもないんだ。
ハッキリ言えば、「ユーザーに対しての親切設計」って意味合いの方が強いんだな。
例えば、条件分岐構文としてif、って単語を利用しているプログラミング言語は多い。
ところが、例えばLispって言語だと、そういう「重要構文の一部」でさえ、ユーザーが勝手に「書き換えて良い」と言う自由を提供している。
[1]> (defparameter if 'hoge)
IF
[2]> if
HOGE
[3]>
これで、以降はこのインタプリタ上では、ifは「条件分岐」ではなくって、単にhogeを格納した変数、って事になっちまった。
もう僕らがifを「条件分岐」として使える事は、この時の「起動したインタプリタ上で」無くなっちまった。
ある意味「危険」だよな(笑)。そういう「危険」を許す言語もある。
これを避ける為に「構文で使われる単語は再定義させないようにしよう」と「親切で」予約語として設定してる「言語仕様」だとか「言語実装」が、あくまで「多い」と言う話なんだ。
それだけ。
でも実の事を言うと、予約語自体があろうがなかろうが、まずは「問題ない」ってのが原則なのね。
何故なら何らかを「再定義」したところで、それは貴方が書いたプログラム上の話、であって、実の事を言うと、何らかのインタプリタの「中身」とか、コンパイラの「中身」を書き換えたわけじゃない。結局、そのテの「言語処理系」を起動した時点で、その言語処理系は作成者が想定したように「初期化」される。この時点で、例えば上の例で言うと「ifは言語設計者が考えたように初期化」されるんで、結果何の問題も生じない、んだ(つまり、その後「プログラミング言語自体が」おかしくなる、って事はない)。
結果、予約語ってのは意味合いで言うと
「これらの単語を貴方が勝手に書き換えると、以降の貴方のプログラムはおかしな動作を始めますよ?」
って事で「親切心」で設定されたモノなんだ。
親切心がどこまでか、ってのはその言語の「設計者」自体にかかってるわけで、「こうすべきだ」って話じゃあないのね。
と言うわけで、貴方が考えるように、「標準ライブラリ内の関数に付いては再定義は許すべきじゃないんじゃないの?」ってのも考え方としては「アリ」なんだ。
Pythonはそこまでしねぇよ、ってだけの話でね。Pythonは「言語仕様がない」言語なんで、そのうちいきなり「貴方が考えてるように」printを予約語にするかもしんない。
でも現時点ではそうじゃない。だから例えば次のようなプログラムを書くのを許す。
>>> list = [1, 2, 3]
>>> list
[1, 2, 3]
これで関数listは単なる変数名になっちまった。
よって以降は、「この起動内」だと文字列をリストに変換する事が出来なくなる。
>>> list("hoge")
Traceback (most recent call last):
File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
exec(code, self.locals)
File "<pyshell#2>", line 1, in <module>
TypeError: 'list' object is not callable
>>>
でもインタプリタを再起動すれば、問題はないわけ。
## 再起動後
>>> list("hoge")
['h', 'o', 'g', 'e']
Pythonの設計者は「これくらいは不具合でも何でもねぇだろ?」って思ってる、って事だな(笑)。だから予約語にしてないわけだ。
結果、例えば昨今の流行りで、「構文を書く単語を予約語にしよう」ってのも、「絶対そうせねばならない」わけじゃなくって、あくまで「凡例」とか「通例」なんだよ。
何かしらの「こうせねばアカン」っつー理論的な何かしら、があるわけじゃないんだ。
あくまで「とある言語での」その言語設計者が思い描く「やっちゃアカン事」に縛られてるわけだな。
繰り返すけど、なんかの理論的「根拠」があるわけじゃないんだ。
予約語はその言語設計者のアイディア次第で左右される、って事だ。
No.4
- 回答日時:
Cにもないですよ。
Javascriptにも無いです。Javaにも有りません。今時標準出力を予約語にしてる言語はほぼなくなっています。
予約語というのは、予約語でないと表現出来ない言語の仕様に不可欠なものに付ける というのが今風です。ライブラリで実装出来るものには予約語は与えられません。不要な予約語が増えれば言語仕様が膨らみ、無駄に言語の実装が膨らむからです。
予約語は主に数式の表現とか制御構文とかに使われ、I/Oの呼び出しに使われることはありません。ライブラリを呼びだすだけです。
#大昔のFortranとかBasicとか、ライブラリがろくに使えなかった頃の言語にはI/O用の予約語が沢山有りました。
No.3
- 回答日時:
解釈がちょっと違います。
コンピュータがプログラミング言語を解釈するとき「字句解析」というものが行われます。
これは、文法が正しいか、正しいならどんな構造をしているかを調べるものです。
https://docs.python.org/ja/3/reference/lexical_a …
この中で変数、関数、命令等の「名前」として解釈するべきものを「識別子」と言います。(あるいは「名前」とも言います)
識別子のうち、特別な意味として使うために他の用途では使えないように制限したものが「予約語」です。
例えば
if = 500
を許してしまうと、ifは変数になってしまうため「if文の始まりを表わる識別子」としては使えなくなります。
https://docs.python.org/ja/3/reference/lexical_a …
一方「定義済み」「組込み」と呼ばれる関数等があります。
これらは「字句解析」では他の識別子と同じ解釈で処理されます。
他の識別子との違いは、実行したときにそれが定義されているかどうかです。
Python3ではprintは「組込関数」になります。
https://docs.python.org/ja/3/whatsnew/2.6.html#p …
https://docs.python.org/ja/3/library/functions.h …
例えば
print("hello world")
というプログラムがあったとすると、実際には
def print(*objects, sep=' ', end='\n', file=None, flush=False):
# 引数を解釈して出力するプログラム
print("hello world")
というプログラムが実行されている、という感じになります。
ユーザーには「自分用のprintが作れる」という利点があり、
開発者には「『print文』用の字句解析が不要になる」という利点があります。
なお、print関数は2.6で先行実装(従来のprint文と切り替え可能)、3.0から本格実装になりました。
それまでは printは「文」であり、予約語でした。
https://docs.python.org/2.7/reference/lexical_an …
No.1
- 回答日時:
printだけが特別なわけじゃなくて、rangeやlenなど事前に存在する関数も普通の変数と同じように、別の値に上書きができます。
同じスクリプト言語のJavaScriptも標準出力のconsole.log()もconsole=1と上書きができます。
しかし、Pythonならdefやpass、JavaScriptならfunctionやvarなど代入不可な単語はあります。
違いとしては、
・Pythonのdefやpass、JavaScriptのfunctionやvarという単語は文法に刻まれている
・print、range、len、consoleは文法に刻まれた単語ではなくあくまで標準機能として実装されているだけ
文法上意味のある単語(予約後)と、標準機能としてすでに存在している単語(予約語ではない)という違いがあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- 婚活 マッチングアプリで学歴を記入しないのは? 40代男性IT企業、年収900万~、役職あり バツイチ←婚 3 2022/07/21 19:21
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- オープンソース プログラム言語について 1 2023/10/24 23:44
- 英語 スマホの予測変換について 1 2022/04/29 07:58
- その他(プログラミング・Web制作) Pythonについて。 5 2024/01/04 19:20
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- iOS iPhoneのSimejiにて文字入力を完了すると、次どのような単語を打つか予測して候補として出して 2 2022/10/21 18:25
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
- 弁護士・行政書士・司法書士・社会保険労務士 契約書の英日翻訳の依頼 1 2023/08/11 00:23
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
ものづくりに向いているプログラミング言語ってなんですか?家電にもプログラミングが使われてるとか
その他(プログラミング・Web制作)
-
C言語の関数と配列に関する質問
C言語・C++・C#
-
gccを行ってもexeファイルが生成されない
C言語・C++・C#
-
-
4
WindowsのCapsLock(キャップスロック)って、何の意味があるんですか?
C言語・C++・C#
-
5
double型が正常に認識されていない恐れ
C言語・C++・C#
-
6
昔のパソコン少年の武勇伝「店先のパソコンでゲームを作成し、それを売り、その金でパソコンを買う」本当?
その他(プログラミング・Web制作)
-
7
Linuxでの開発環境構築や設定のコツ
C言語・C++・C#
-
8
家庭のパソコンで Python の 環境構築を行います。 windows 11 です 事情があって
その他(プログラミング・Web制作)
-
9
ホワイトハッカー
その他(プログラミング・Web制作)
-
10
プログラミングで例えばゲームを作る際に、そのコードで何故その画面が表示されるようになってるんでしょう
その他(プログラミング・Web制作)
-
11
最新のプログラム言語を学ぶには何がいいですか?
その他(プログラミング・Web制作)
-
12
質問失礼します。 プログラム言語を一つも知らないのですが、C♯の勉強をしてみたいです。おすすめの教材
C言語・C++・C#
-
13
[C言語]fputsとfprintfの違い
C言語・C++・C#
-
14
C言語って古いですか?
C言語・C++・C#
-
15
どなたかこのプログラミングを完成させて欲しいです。 ヒントはこちらです↓ 青色:ゲームプログラムのル
C言語・C++・C#
-
16
そのまま使っただけなのに・・・python
その他(プログラミング・Web制作)
-
17
プログラムの素朴な質問です 分岐するコードを書く時に、 /** * 関数 */ sub(){ ...
その他(プログラミング・Web制作)
-
18
IT業界より楽に稼げる業界ってあるんですか?銀行とか?
その他(プログラミング・Web制作)
-
19
プログラミングの雑談とかできるサイトないですか?
その他(プログラミング・Web制作)
-
20
こんなことてしますか??
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進の10進変換について
-
swift 文字コードから文字に変...
-
Use of uninitialized value ---
-
I2C接続のLCDディスプレイを使う
-
python print文のエラー
-
pythonで演算子を変数に代入す...
-
Pythonでターミナルに文字を出...
-
関数「exists」と「defined」の...
-
pythonの*
-
数値かどうかの判定方法
-
ヒアドキュメントで表示した、...
-
python で連想配列に代入、キー...
-
CGIでimgタグでalignを使うとエ...
-
変数の中は文字列か数値か調べ...
-
【至急!!!】python言語で本を見...
-
MAXnum = input('最大数は?') f...
-
オーバーライドについて
-
シェルスクリプトで、空白(ス...
-
Perlの例文でif($a==1&&$b==5&&...
-
Pythonの np.indicesに関する質...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Pythonでターミナルに文字を出...
-
16進の10進変換について
-
パイソンのクラスについて
-
【至急!!!】python言語で本を見...
-
シェルスクリプトで、空白(ス...
-
I2C接続のLCDディスプレイを使う
-
int(input("○○"))の使い方
-
数値かどうかの判定方法
-
pythonで演算子を変数に代入す...
-
awkの正規表現での最左最短マッ...
-
Pythonでコンソールをクリアす...
-
pythonを使ったプログラミング...
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
ソケットでのデータ送受信につ...
-
pythonの*
-
Perlの例文でif($a==1&&$b==5&&...
-
数値をスラッシュで区切る方法
-
変数の中は文字列か数値か調べ...
-
PythonでUTF8の文字列をリスト...
おすすめ情報