質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

658閲覧

pythonにおける変数について。

greenleave10000

総合スコア67

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/29 13:45

編集2020/10/31 09:28

ここでPythonとはPython3の話をしているのですが、Python3でもPython2でも同じなのであればPython2の話でも大歓迎です。
(https://docs.python.org/ja/3/tutorial/controlflow.html#defining-functions)でpythonの変数がobject referenceであるようなことが示唆されていて(値 (value) とは常にオブジェクトへの 参照(reference) をいい、オブジェクトの値そのものではありません。[docsより引用])、実際に調べてみてもそう書かれているサイトがたくさん見つかります。そこで質問なのですが、

  1. pythonの変数はポインタであると言う解説を見たのですが、そうなのでしょうか?ポインタであるならば、C言語等のメモリアドレスを指すポインタとということでしょうか?
  2. a = 1としたときにaは1という値を持つ整数オブジェクトのポインタを持っているのでしょうか?それともid(a)で得られるような値を持っているのでしょうか?
  3. (https://docs.python.org/ja/3/reference/simple_stmts.html#assignment-statements)に、「名前は現在のローカル名前空間内のオブジェクトに束縛されます。[docsより引用]」とあります。ということは変数なんてものはなくて、あるのはたくさんのオブジェクトとたくさんの各オブジェクトのエイリアスのリストみたいなもの?ということなのでしょうか?

1.と2.は若干被った質問になってしまいましたすみません。間違ったところがあればビシバシ指摘していただけるとありがたいです。

※また、この辺のことを解説してる公式のドキュメントとか教えていただけないでしょうか?見落としてるだけで(https://docs.python.org/3/)にあるなら、どこにあるを教えてください。よろしくお願いします。

追記1:
実装のことを書き忘れていました。一応CPythonでの話です。

謝辞:
otnさん、TakaiYさん、quickquipさん、回答していただきありがとうございます。
おかげさまで疑問が解消し、すごくもやもやがスッキリしました。
どなたの回答も一様に素晴らしく、わかりやすく、Pythonやプログラミング言語の理解に近づくことができ優劣は付け難いものです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

十分な回答はあると思いましたが、落ち穂拾い的に。

Pythonの言語仕様や実行モデル上に「変数がない」のは本当です。
まず、言語リファレンスの目次に変数という項目が出て来ません。

あるのは名前づけと束縛 (naming and binding)です。
そこにはこうあります。

名前 (name) は、オブジェクトを参照します。名前を導入するには、名前への束縛 (name binding) 操作を行います。
以下の構造で、名前が束縛されます
(略)
ある名前がブロック内で束縛されているなら、 nonlocal や global として宣言されていない限り、それはそのブロックのローカル変数 (local variable) です。 ある名前がモジュールレベルで束縛されているなら、その名前はグローバル変数 (global variable) です。

Pythonにおける変数の定義はここです。

繰り返しになりますがあえてもう一度書くと、

ある名前がブロック内で束縛されていて、かつ nonlocal や global として宣言されていないなら、その名前は「そのブロックのローカル変数」

ある名前がモジュールレベルで束縛されているなら、その名前は「グローバル変数」

というのがPython言語における変数の定義です。

つまりPythonの言語仕様には「値に名前が束縛される」という機構がまずあって、そしてそうやって束縛された名前のことを便宜上変数と呼んでいるだけなのです。

投稿2020/10/31 09:09

編集2020/10/31 09:09
quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

greenleave10000

2020/10/31 09:20

>束縛された名前のことを便宜上変数と呼んでいるだけ なるほど、すごくもやもやがスッキリしました。 「つまりPythonの言語仕様には「値に名前が束縛される」という機構がまずあって、そしてそうやって束縛された名前のことを便宜上変数と呼んでいるだけなのです。」この説明すごくわかりやすいです。ほんとにありがとうございます。
guest

0

otnさんの回答へのコメントにコメントしようと思ったのですが、長くなったのでこちらに書きます。

「Pythonではすべてのデータはオブジェクトで表されるの」と理解しておられるようですが、その「すべてのデータ」というのは、操作の対象となる、数(intやfloatなど)や文字列・リスト・辞書などのpythonで扱うもののことで、内部で扱われる全てがオブジェクトというわけではありません。javaなどにはプリミティブ型のものがあったりすることと対比して「全て」と言っているだけでしょう。

「オブジェクトを入れる箱ではありません」ということで、「じゃあ変数の中にオブジェクトが入っていないとすれば何が入っているのか」ということになるのでしょうが、そもそも変数は入れ物と考えないほうがいいでしょうね。
変数には紐がついていて、その先がオブジェクトにくっついているというようなイメージがいいと思っています。 また、そのことを「変数がオブジェクトに束縛されている」という言い方もします。

python

1a = [1, 2] 2b = a

の場合、1) 1 と 2 を含むリストオブジェクトが作られ、 2) aという変数がそのオブジェクトに紐づけられ、 3) 変数bが作られaのと同じオブジェクトに紐づけられます。
2)でのaへのオブジェクトの代入のときに、そのオブジェクトが変数の箱に入るのでなく、また、3)のときに、箱の中身がコピーされないことからポインタのようなものであると表現されるのでしょうが、ポインタのポインタは無いし、ポインタ演算はできないし、ポインタの値を取り出すこともできないので、ポインタではありません。
ようするにポインタをちゃんと知っている人からすれば、pythonの変数はポインタではありません。

「変数なんてものはなくて~」の部分も、エイリアスの意味にもよりますが、変数がオブジェクトに従属しているようなニュアンスですが、別の独立した存在で、先の例では、a は [1, 2] に束縛されていましたが、再代入することで、別のオブジェクトに束縛することができるので、独立した別の概念です。

投稿2020/10/30 11:27

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

greenleave10000

2020/10/30 12:23 編集

呪文のようにいろいろな本やサイトで四角い枠が横に連なったあの図と「変数は箱」を見てきたせいで、Pythonでの変数がイメージしにくいのですが、 Pythonにおいて変数は、名前だけの存在というか、ただの値札みたいなので代入という体で新しく作ったオブジェクトに新しい値札をはったり、再代入と言う体でその値札を違うオブジェクトに張り替えるみたいなただの単語というかキーワードというかaという変数もただリストオブジェクト`[1, 2]`に紐付いてるだけの「名前」って感じなのですね。
TakaiY

2020/10/30 14:08

そうですね。 C言語は、メモリやCPUのレジスタといったコンピュータのHWを直接操作して作業をする言語ですが、pyhonなどのモダンな言語は、各種のデータをの操作に焦点をあてていて、それらを保持/ラベリングするために変数を使っているという漢字だと思います。
greenleave10000

2020/10/31 09:17

なるほど!同じプログラミング言語だからC言語と同じようにPythonを見ていましたが、意外とかなり根本から違う(ところもある)のですね。プログラミング言語に対する認識がかなり変わりました。本当にありがとうございます。
guest

0

1,2:
Cのポインターのような論理メモリ上のアドレスが入っているのか?ということであれば、違うでしょう(そういう実装のPythonが無いとは言い切れませんが)。
オブジェクトを一意に指し示す何らかの値が入っています。それがid()の値と等しいかどうかは分かりませんが、id()の値と一対一対応する値が入っています。

3:
変数は、オブジェクトに貼られたラベル(名札)いう説明がされることも多いです。
1つのオブジェクトに複数のラベルが貼られていることもある。

foo="aaa"であればfooはオブジェクト"aaa"に貼られたラベルに書かれた名前と理解しやすいですが、bar[1]="aaa"みたいなときにラベルの比喩がちょっとわかりにくいです。

Cだと変数は何かを入れる「箱」ですが、すくなくともPythonの変数はオブジェクトを入れる箱では無いです。

投稿2020/10/29 14:02

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

greenleave10000

2020/10/30 01:02

返信ありがとうございます。 >Cだと変数は何かを入れる「箱」ですが、すくなくともPythonの変数はオブジェクトを入れる箱では無いです。 だとすると、Pythonではすべてのデータはオブジェクトで表されるので、「オブジェクトを一意に指し示す何らかの値」もオブジェクトであるはずだから、僕の質問1,2は質問自体が間違っているということになるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問