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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

Q&A

解決済

2回答

1897閲覧

Pythonのオブジェクトのプロパティはなぜクォートで囲む必要があるのか?

611olj

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

0グッド

1クリップ

投稿2020/07/08 13:47

Pythonでは
a = {'v': 3}とは書けますが
a = { v: 3 }とは書けません。
JavaScriptでは書けるのに。

なんでなんでしょうか?

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

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

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

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

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

shiracamus

2020/07/08 15:17

JavaScript で 変数の値をキーにするときにはどうするのですか? 面倒じゃないですか?
611olj

2020/07/10 13:05 編集

すみません。質問の意味が理解できません。 具体的にプログラム書いてくれませんか?
shiracamus

2020/07/10 13:53 編集

Python では、変数 v が v = "key" のとき、 data = { v: 123 } で 変数data が { "key": 123 } になりますけど、JavaScript で 変数 v を使って data が { key: 123 } となるように書くにはどう書くのですか?
611olj

2020/07/14 01:02

コード書いてくれてありがとうございます。 const v = 'key'; const data = {}; data[v] = 123; console.log(data); ({key: 123}と出力されます) data = {}; と初期化する必要があり、手間ですね。
shiracamus

2020/07/14 02:27 編集

const v = "key"; const data = { [v]: 123 }; と書くこともできます。 JavaScriptでは、文字列をキーにする場合はダブルクオートで囲まない(囲ってもいい)、変数の内容をキーにする場合は角括弧で囲む。 Pythonでは、文字列をキーにする場合はダブルクオートで囲む、変数の内容をキーにする場合は何も囲まない。 どっちが手軽か、分かりやすいか、人それぞれ意見があると思いますが、言語仕様としてどちらかに決められています。
611olj

2020/07/14 02:37

>const data = { [v]: 123 }; こんな書き方あるんですね。 勉強になります。ありがとうございます。
guest

回答2

0

ベストアンサー

まず前提として、javascriptにおけるa = { v: 3 } というのはjavascriptのオブジェクトに関係している一方、
pythonにおける a = { v: 3 } というのはpythonの辞書に関係しており、書き方は似ていますが別物です。

そのうえで質問者さんの問題を整理すると、
1. javascriptでは、初出の文字vに関して
var a = { v: 3 };
を実行しても特にエラーが出ませんが、

2. pythonでは未定義の変数vに対して
a = {v: 3}
を実行すると、
NameError: name 'v' is not defined

というエラーが発生する。これはなぜか?という質問だと把握しました。

ただ、pythonでも、can110さんが結果を書いているように

lang

1v = "keystr" # <=文字列なら何でもいいです。 2a = {v: 3} 3 4w = 100 # <=整数でもOK 5b = {w: 50}

というように、先に名前(変数)を定義しておけば、javascriptと同じように書いてもエラーが出ません
(なお、必ずエラーが出ないわけではなく、辞書のキーは、文字列やタプルなど「hashableなものでなければならない」という条件があります)

なぜこのような違いが生じるかですが、ぶっちゃけていうと、言語が異なるから、ということになるでしょう。

でもこれだと回答にならないので、以下は推測を交えて説明します。

javascript:「オブジェクト」との関係、ラクに速くスクリプトを書けること

javascriptにおけるa = {v: 3}というのは、オブジェクトに対するプロパティの定義です。
これは

lang

1var a = new Object(); 2a.v = 3;

というように、オブジェクトを作ってから、vというプロパティに値を代入する形でも書けます。

javascriptでオブジェクトのプロパティに使用できるのは、一定の条件に該当する識別値か、引用符で囲まれた文字列、もしくは数値に限られるようです。(間違っていたらすみません)

そして、プロパティ位置に置かれた識別値や数値は、引用符で囲まなくても、自動的に文字列として解釈されるようです。(※「1st_key」のように先頭が数字になっているものや途中に空白があるもの等は引用符を省略できません)
つまり{v: 3} と書くと {"v": 3} と書いたものとして解釈されます。
var v = "keystr"
としたあとで
var a = {v:3};としても
aは{"keystr": 3} ではなく、 {"v": 3} になります。

javascriptでは、わざわざ引用符を書かなくてもプロパティ位置に指定されたものを文字列として扱うことで、引用符を書く手間をなくしている(と私は推測しています)

たった「"」2回といえど、何行も書くとなると結構時間の無駄になりますよね?
引用符のペアをそろえていないとエラーになりますし、

lang

1var myBox = new Object; 2myBox = {front: {color: {type: 'high', 'code': '#ffffff'}}};

というように、プロパティを引用符なしで定義でき、

lang

1c = myBox.front.color.code;

と引用符なしでプロパティにアクセスできるのは便利です。

(pythonで外部ライブラリを使わず普通に辞書を使うとなると

lang

1myBox = {"front": {"color": {"type": "high", "code": "#ffffff"}}} 2c = myBox["front"]["color"]["code"]

とする必要があります)

python:プログラムとしての直感性・柔軟性

上の例では、pythonでは一度定義した変数であれば、任意に辞書のキーとして指定できるように見えます。
(繰り返しますが「hashableなものしかキーにできない」という制約はあります)

そのかわり、javascriptと異なり、未定義の変数に該当する文字列を文字列としてのキーに指定する場合は必ず引用符で囲まなければなりません。(でなければ上記のようにNamedErrorが出てしまいます)
pythonの辞書はjavascriptのオブジェクトに比べると、記述に手間がかかる・・・?

でも、この「変数を辞書のキーとして指定できる」という仕様は、メリットもあると思います。

プログラミングをやっている立場からすれば、引用符で囲まれていないものは、中身が必ずしも文字列とは限らないというのは日常茶飯事です。
javascriptの例のように 
var v = "keystr" としたあとで a={v:3}としたら
aは{"keystr":3} ではなく、 {"v":3}‘となってしまうのは、直感に反するような気がしませんか?

辞書のキーに(hashableなものに限りますが)変数を指定できるからこそ

lang

1if 64 < i < 64 + 26 + 1: 2 a = {chr(i): i} 3else: 4 a = {"DUMMY": 0}

とか

lang

1s = {chr(i): i for i in range(65, 65 + 26)} 2>>> print(s) 3>>> {'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69, 'F': 70, 'G': 71, 'H': 72, 'I': 73, 'J': 74, 'K': 75, 'L': 76, 'M': 77, 'N': 78, 'O': 79, 'P': 80, 'Q': 81, 'R': 82, 'S': 83, 'T': 84, 'U': 85, 'V': 86, 'W': 87, 'X': 88, 'Y': 489, 'Z': 90}

のような柔軟なプログラミングが可能になります。

※もちろんjavascriptでも、

lang

1var a = new Object(); 2var k = 'DUMMY'; 3a[k] = 0; //a['DUMMY'] = 0; または a.DUMMY = 0; と同じ

というように、連想配列を使うことで同じようなことはできます。

pythonでも、attrdictという外部ライブラリを使うことで、辞書をドットでアクセスすることは可能です。

以上、つらつらと書きましたが、あくまで私自身の推測によるところが大きいですので、もっと深遠な理由があるやもしれません。

参考にしたもの:
MDN オブジェクトでの作業
Python における hashable
連想配列を使ったプロパティへの値の代入と参照
Pythonで辞書のキーにtupleが指定できた件(+パフォーマンスの話)

投稿2020/07/08 15:55

編集2020/07/08 17:15
patapi

総合スコア667

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

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

611olj

2020/07/10 13:00

詳細な回答ありがとうございます。 回答のPythonの説明の箇所の理解がいまいちです。 勉強してまた見直そうとおもいます。
guest

0

Pythonでも書けます。

Python

1(base) C:\Users\user\desktop>python 2Python 3.7.6 | packaged by conda-forge | (default, Jun 1 2020, 18:11:50) [MSC v.1916 64 bit (AMD64)] on win32 3Type "help", "copyright", "credits" or "license" for more information. 4>>> () 5>>> a = { v: 3 } 6>>> print(a) 7{'v': 3} 8>>>

投稿2020/07/08 14:17

can110

総合スコア38262

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

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

611olj

2020/07/10 12:58

あ、書けるんですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問