Python変数のスコープについて
给我你的怀抱
给我你的怀抱 2017-05-18 10:53:10
0
3
730

こんな関数があります:

リーリー

呼び出し後は問題は発生しませんでした。出力:
140560473157960
140560473157960
140560473157960
140560473157960
[1, 2, 3]

ただし、次のように、内部の x を文字列に置き換えます。 リーリー

再度電話をかけると次のようになります:

リーリー

  • ルールによれば、

    inside 関数を入力するときに、x が元の 'outside' 文字列を指さないのはなぜですか?

  • 未定義の変数は

    NameError を生成すべきではないでしょうか? なぜここで生成しないのでしょうか?

  • 文字列とリストは C のポインタに似ていると最初は思っていましたが、そうではないようです。可能であれば、この点について少し紹介できればと思います。ありがとうございます。

给我你的怀抱
给我你的怀抱

全員に返信(3)
我想大声告诉你

簡単なものから難しいものまで 1 つずつ答えます。これは私の謙虚な意見なので、誰かが言っていることが間違っていると気づいた場合は、指摘していただければ幸いです
C のポインターと同様に : これは正しいです。動作すると、このオブジェクトを指す他の変数に影響します。例: py里面, 几乎所有的事物都是对象, 就连变量赋值, 也是先生成对象, 再让变量指向这个对象,而对象还分可变对象不可变对象, 在对可变对象 リーリー

の場合、古いオブジェクトを直接破棄し、新しいオブジェクトを指します。例:

リーリー 不可变对象そのため、Python オブジェクトを操作するときは、そのオブジェクトがどの型に属しているか、また、これらの特性により操作が失敗するか、または望ましい効果が得られないかを念頭に置く必要があります。

未定義の変数

: Python が変数を検索するとき、検索が完了するか見つからない場合にのみ、 例外がトリガーされます。これについては、私のブログ投稿の 1 つを参照してください。 Python:スコープ(スコープ)とLEGB NameError

UnboundLocalError

: この問題は最も一般的であり、説明するのが最も難しい問題です。なぜなら、ELGB の順序に従って変数が検索されることを私たちは常に当然のことと考えているからです。実際、私たちの理解は間違っているのではありません。それを無視します 1 点: 、関数コードセグメントに代入ステートメントがない場合、この問題は発生しませんが、代入ステートメントが出現するとエラーが報告されるのはなぜですか? これは Python のスコープに関連しています。上記の記事で述べたように、Python のスコープは動的ではなく静的であることがスクリプト ファイルのインデントから確認できるため、コード内では次のようになります。リーリー

Ininside中, 已经有了赋值语句, 所以对于x,他已经不会从enclosing 或者global甚至bulitin里面去查找, 它已经被认定在local域了, 只是这个值并没有和真正的对象'inside'建立起绑定关系, 因为代码没有运行到真正的赋值语句, 所以, 会触发这个UnboundLocalError. 而为什么那个列表会可以那样做, 因为他们两个是完全不同的操作, 同样都是print(id(x))list的操作字节码是LOAD_DEREF, 而字符串的操作字节码是LOAD_FAST, 而x[:]=[1,2,3]/x='inside'分别对应的字节码又是STORE_SLICE+3STORE_FAST, 前者是在原来的基础上修改, 而后者是重新指向新的对象, 而这两种方式的区别, 决定了,它们在构建函数时, 以怎样的形式存放x, 这个就涉及到python函数构建的原理了, 有兴趣可以看看源码中的object/ceval.c源码, 这是虚拟机运行的原理, 关于这个问题可以简单看我另一篇文章, 比较简单将UnboundLocalError: 魔法の UnboundLocalError: 割り当ての前にローカル変数 x が参照されたことについて話しましょう

いいねを押す +0
某草草

inside 関数で新しい変数 x を再割り当てしましたが、2 つの x のスコープが異なります。
UnboundLocalError は、内部スコープで初期化されていない変数を出力したために発生します。
詳細については、この説明を参照してください:
https://docs.python.org/2/faq...

いいねを押す +0
洪涛

基本的に、Lin_R はそれを非常に明確にしました。
外部機能と内部機能のドメインは異なります。 inside 関数で x に値を代入したため、変数 x が inside 関数で使用されると、x は inside のローカル ドメインにあるとみなされます。このとき、x は他のフィールドの値を使用しません。したがって、print(x) を実行すると、x には初期化された値がないため、エラーが発生します。 C では定義済みだが割り当てられていない変数を使用することができますが、Python ではこれが許可されません。

Python3 には、この問題を解決する非ローカルなステートメントがあります。

リーリー

グローバル ドメインには x 変数がないため、現時点では global ステートメントを使用できないことに注意してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート