問題タブ [python-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Pythonリストの追加が同種でなければならないのはなぜですか?
Pythonの内部(CPythonまたは他の実装)に精通している人は、リストの追加が同種である必要がある理由を説明できますか?
上記が上記のトランスクリプトx+"foo"
の最終値と同じ値を返さないのはなぜですか?x
この質問は、ここでのNPEの質問に続くものです。Pythonのリストの動作+ =反復可能であるかどうかは、どこにでも文書化されていますか?
更新:異種の作業は必須ではないことを私は知っています+=
(しかし、そうします)。同様に、異種の作業が+
エラーである必要はありません。この質問は、なぜ後者の選択がなされたのかについてです。
リストにシーケンスを追加した結果が不確実であると言っても過言ではありません。それが十分な異議である場合、異質性を防ぐことは理にかなってい+=
ます。Update2:特に、Pythonは常に演算子の呼び出しを左側のオペランドに委任するため、「何をするのが正しいか」という問題は発生しません。左側のオブジェクトが常に支配します(右側に委任しない限り)。
Update3:これが設計上の決定であると主張する人のために、(a)それが文書化されていない理由を説明してください。または(b)文書化されている場合。
Update4:「何を[1] + (2, )
返す必要がありますか?」の直後にx
最初に保持されている変数の値と等しい結果値を返す必要があります。この結果は明確に定義されています。[1]
x+=(2, )
python - クラス定義のリスト内包表記からクラス変数にアクセスする
クラス定義内のリスト内包表記から他のクラス変数にどのようにアクセスしますか? 以下は Python 2 では機能しますが、Python 3 では失敗します。
Python 3.2 では次のエラーが表示されます。
努力してもうまくいきFoo.x
ません。Python 3 でこれを行う方法についてのアイデアはありますか?
もう少し複雑な動機付けの例:
この例でapply()
は、適切な回避策でしたが、残念ながら Python 3 から削除されました。
python - __slots__ はどのようにして辞書検索を回避しますか?
__slots__
辞書検索を避けることでオブジェクトが高速になると聞いたことがあります。私の混乱は、Python が動的言語であることから来ています。a.test
静的言語では、コンパイル時の最適化を実行して実行する命令にインデックスを保存することで 、辞書検索を回避します。
現在、Python ではa
、辞書または異なる属性セットを持つ別のオブジェクトを簡単に作成できます。ディクショナリ ルックアップを行う必要があるようです。唯一の違いは、各オブジェクトのディクショナリではなく、クラスのディクショナリが 1 つだけ必要であることです。
この理性で、
__slots__
辞書検索を回避するにはどうすればよいですか?- スロットはオブジェクトへのアクセスを高速化しますか?
python - タプルはCPythonでどのように実装されていますか?
私は、CPython が舞台裏でどのように実装されているかを学ぼうとしています。Python がハイレベルであることは素晴らしいことですが、ブラック ボックスのように扱うのは好きではありません。
それを念頭に置いて、タプルはどのように実装されますか? ソース (tupleobject.c)を見てきましたが、頭を悩ませています。
私はそれを見てPyTuple_MAXSAVESIZE = 20
、PyTuple_MAXFREELIST = 2000
保存と「フリーリスト」とは何ですか? (長さ 20/21 または 2000/2001 のタプル間にパフォーマンスの違いはありますか? 最大タプル長を強制するものは何ですか?)
python - obj.__closure__ には正確に何が含まれていますか?
Beazley pg 100 は次のように述べています。
私の理解では、それ__closure__
はリストですが、このセルのものと str オブジェクトは何ですか?? 1 項タプルのように見えますか?
python - インタプリタが保持する整数キャッシュはどうなっていますか?
Python のソース コードを調べてみると、から(@src/Objects/intobject.c)PyInt_Object
までの s の配列が保持されていることがわかりました。int(-5)
int(256)
ちょっとした実験がそれを証明しています:
しかし、これらのコードを py ファイルで一緒に実行すると (またはセミコロンで結合すると)、結果は異なります。
なぜそれらがまだ同じオブジェクトであるかに興味があるため、構文ツリーとコンパイラをさらに掘り下げて、以下にリストされている呼び出し階層を思いつきました。
PyInt_FromLong
次に、 inと before/after にデバッグ コードを追加しPyAST_FromNode
、test.py を実行しました。
出力は次のようになります。
これは、cst
toast
変換中に 2 つPyInt_Object
の異なる が作成される (実際にはast_for_atom()
関数内で実行される) が、後でマージされることを意味します。
PyAST_Compile
とのソースを理解するのは難しいと思うPyEval_EvalCode
ので、助けを求めるためにここにいます。
python - 辞書とセットの順序が任意なのはなぜですか?
Python の辞書またはセットのループ処理が「任意の」順序で行われる方法がわかりません。
つまり、プログラミング言語なので、言語のすべてが 100% 決定されている必要がありますね。Python には、辞書またはセットのどの部分が選択されるか (1 番目、2 番目など) を決定する何らかのアルゴリズムが必要です。
私は何が欠けていますか?
python - Python文字列インターン
この質問は実際には実際には使用されませんが、Pythonが文字列インターンをどのように行うかについて興味があります。私は次のことに気づきました。
これは私が期待した通りです。
これを行うこともできます。
そして、それはかなり賢いです!
しかし、これを行うことはできません。
なぜPythonは評価せずs1+"g"
、それが同じであることに気づきs2
、同じアドレスを指すのでしょうか?その最後のブロックで実際に何が起こっているのFalse
でしょうか?
python - .pyc ファイルはいつ更新されますか?
「.pyc」ファイルはプレーンテキストの「.py」ファイルのコンパイル済みバージョンであり、プログラムをより高速に実行するために実行時に作成されることを理解しています。しかし、私はいくつかのことを観察しました:
- 「py」ファイルを変更すると、プログラムの動作が変わります。これは、「py」ファイルがコンパイルされているか、少なくとも何らかのハッシュ プロセスを実行するか、再コンパイルする必要があるかどうかを判断するためにタイム スタンプを比較することを示します。
- すべての「.pyc」ファイル (
rm *.pyc
) を削除すると、プログラムの動作が変わることがあります。これは、「.py」の更新時にコンパイルされていないことを示しています。
質問:
- いつコンパイルするかをどのように決定しますか?
- 開発中のチェックをより厳密にする方法はありますか?
python - Python モジュールの __name__ 変数はどのように定義されていますか?
私は標準的な例を認識しています。モジュールを直接実行すると、その__name__
グローバル変数は として定義され"__main__"
ます。ただし、ドキュメントのどこにも__name__
、一般的なケースで がどのように定義されているかについての正確な説明を見つけることができません。モジュールのドキュメントには...
モジュール内では、モジュールの名前 (文字列として) をグローバル変数の値として使用できます
__name__
。
...しかし、「モジュールの名前」とはどういう意味ですか? モジュールの名前 (.py
削除されたファイル名) だけですか、それとも完全修飾パッケージ名も含まれていますか?
__name__
Python モジュールの変数の値はどのように決定されますか? おまけとして、Python ソース コードのどこでこの操作が実行されているかを正確に示してください。