3

明示的な (型) 宣言なしでは、物事がどのように機能するかを理解しようとするのに苦労しています --- Python コードをよりよく読むためのルール/ヒントの良い親指はありますか? ありがとう!

4

4 に答える 4

3

この質問が与える最初の印象にもかかわらず、Python の開発者なら誰でも興味を持つべき何かをあなたが潜在意識に持っていることを明らかにするので、それは確かに非常に賢いと思いますが、誤解されていない場合でも、一般的に、特に説明では非常に無視されています。 .

つまり、Python のベースである IMO は、非常に古風で知的なものです。それは、それが考案されたデータ モデルです。
この Python のデータ モデルには、他の言語とは異なり、「内容が変化する可能性のあるメモリのチャンク」という意味での変数はなく、Python ではこの正確な種類の変数を管理していないという意味でも変数はありません。

より正確には、Python ではすべてがオブジェクトであり、すべてのオブジェクトは名前が付けられ、識別子を使用して設計されていますが、オブジェクトも識別子も、前述の意味での「変数」ではありません。

これは、他の言語では変数と呼ばれる小さなボックスがなく、実装の奥深くで一時的に値を出入りする値をホストしていないという意味ではありません。

.

オブジェクトが識別子 で設計されているとしますXYA2
個人的には、この文字の外観を使用して識別子を指定します。識別子は、コードに書かれた単語に他なりません。コードに現れるものです。
この文字の外観は、この stackoverflow.com サイトで、ボタン {} をクリックしてテキスト内のコード サンプルを表すために使用されるものであることに注意してください。それを思い出すのは簡単です。

さて、という名前のオブジェクトXYA2実在のものであり、コンピューターメモリにある具体的なビットのセットであり、それが表す目的の概念的な値を表します。 このセットは、Python が実装されている C 言語で定義されています。 個人的には、物を指定したい時は太字にしています。 次に、名前のオブジェクトは、私にとって、XYA2によって参照されます。


XYA2

識別子はXYA2
、オブジェクトを指す基になるアクセスできないポインターにリンクされています。
このリンクは、シンボル テーブルによって行われます。ここでスタックオーバーフローや他の場所で、一般的にシンボルテーブルへの参照や暗示はほとんど見られません。しかし、それは非常に重要だと思います。

識別子にリンクされたポインターはXYA2、オブジェクトXYA2
を指します。 したがって、XYA2ポインターに直接リンクされ、オブジェクトに間接的にリンクされます。
「間接的にリンクされた」と言う代わりに、「割り当てられた」と言います。オブジェクトとその識別子は相互に割り当てられますが、このリンクの媒体は基になるポインターです。

.

そして今、重要なことがあります。
厳密に言えば、変数は「内容が変化する可能性のあるメモリの塊」です。
私は個人的に、「変数」という言葉を、これとは別の意味で使用しないように努めています。
問題は、数学で「変数」という言葉が使用されているため、この言葉が無差別に使用されることが非常に多く、正当化されていない場合でも、多くの開発者 (すべてではない) によってあらゆる方向にこの言葉が投げかけられることです。
そのため、コード内の識別子とも呼ばれる名前を指定するために、ほぼすべての人が一般的に使用しています。しかし、この慣行は恐ろしく混乱します。慎重に避ける必要があります。

とは言っても、Python のオブジェクトはあるクラスのインスタンスであるだけでなく、何よりも具体的なビットのセットです。私が知る限り、「内容が変化する可能性のあるメモリの塊」という意味で変数ではないセット。
したがって、アクセスして操作できるエンティティは識別子とオブジェクトのみであるため、Python には変数は存在しないという私の意見です。

ただし、実行された Python プログラムの内部プロセスは、厳密な意味での実際の変数である大量のポインターを使用します。
だから、ある意味では、「Python には変数がない」という私の断言は間違っている
と言えます。それは観点の問題です
。Python の開発者として、概念的に言えば、私は変数を管理しません。アルゴリズムについて考えてみてください. ポインタのレベルでは考えません. たとえポインタが存在することを知っていて, それらが存在することを知ることが非常に重要であることを知っていたとしても. 変数のレベルではなく, Python のデータのレベルで. Python プログラムに変数があると信じることを受け入れなければならない理由がわかりません.マシンの低レベルに変数があります.

.

なぜ私はこれをすべて書いたのですか?

1)
Python のデータ モデルの性質には、このデータ モデルを知らなければ理解できない多くの結果があるためです。これらの結果の中には、信じられないほどの可能性をもたらす興味深いものもあれば、トラップ (よく知られている例: コピーされたリストの要素を変更すると、元のリストの要素も変更される) もあります。そのため、このデータ モデルについて学ぶことがまず重要です。

そのために、ドキュメントの次の部分を読むことをお勧めします:オブジェクト値と型の
3.1命名とバインディングの 4.1

.

2)
あなたの当惑に対する私の答えを正当化するために:フードの下で何が起こるかについて苦労しないでください:
ガベージコレクター、参照カウンター、基礎となる辞書のようなエンティティのワゴン、基礎となるポインターの秘密の値の雷鳴のようなバレエがあります、インタプリタによる多くの検証... うまく適合しない場合は、例外のメッセージの形で警告が与えられます。

Python はすべての機械を制御します

必要な唯一の懸念事項は、達成したいアルゴリズムについて考えることです。そのためには、データ モデルを知ることが不可欠です。

Python ユニバースへようこそ


警告

私は自分自身を非常に熟練した Python 開発者だとは考えていません。Python に関するいくつかの重要なことを理解する前に多くの問題を抱えていた単なるアマチュアです。
上記の説明はすべて、Python のデータ モデルに関する私の個人的な見解です。この説明のどこかが間違っている場合は、議論を発展させて教えていただければ、喜んで詳しく教えていただきたいと思います。
しかし、このビジョンによって、多くの困難な問題を理解し、それに答え、Python が可能ないくつかのトリッキーなメカニズムを実現できるという事実を強調しておきます。したがって、この上記の説明がすべて間違っているわけではありません。

于 2013-02-10T18:20:25.160 に答える
2

PEP8 のドキュメントを参照してください。これは、Python の書式設定とスタイルについて説明しています。

于 2013-02-10T16:16:41.730 に答える
1

ダックタイピングを読んでください。Duck Typing の目的の 1 つは、何かの型について考えすぎないようにすることです。本当に気になるのは、変数を思い通りに使用できるということです。

Python では、割り当てる名前はオブジェクトへの単なるポインターであり、いつでも変更できるため、型宣言は必要ありません。

a = None
a = 1+5
a = my_function() # calls my function and assigns the return object to a
a = my_function # Assigns the function itself to a. You could actually pass it as a parameter
a = MyClass() # Runs the __init__() function of the class and assigns the return value to a
a = MyClass # Assigns the class itself to a.

これはすべて有効な Python です。理由が完全に明確でない限り、タイプを変更することは嫌われますが、これを順番に実行することもできます。

于 2013-02-10T16:36:05.663 に答える
0

がわかっている場合c++11は、 auto タイプに似ています。

The variable type is decided on the bases of its assignment. 
于 2013-02-10T16:13:46.987 に答える