こんな関数があります:
リーリー呼び出し後は問題は発生しませんでした。出力:
140560473157960
140560473157960
140560473157960
140560473157960
[1, 2, 3]
ただし、次のように、内部の x を文字列に置き換えます。 リーリー
再度電話をかけると次のようになります:リーリー
inside 関数を入力するときに、x が元の
'outside' 文字列を指さないのはなぜですか?
NameError を生成すべきではないでしょうか? なぜここで生成しないのでしょうか?
簡単なものから難しいものまで 1 つずつ答えます。これは私の謙虚な意見なので、誰かが言っていることが間違っていると気づいた場合は、指摘していただければ幸いです
の場合、古いオブジェクトを直接破棄し、新しいオブジェクトを指します。例:C のポインターと同様に : これは正しいです。動作すると、このオブジェクトを指す他の変数に影響します。例:
py
里面, 几乎所有的事物都是对象, 就连变量赋值, 也是先生成对象
, 再让变量
指向这个对象
,而对象还分可变对象
和不可变对象
, 在对可变对象
リーリーリーリー
未定義の変数不可变对象
そのため、Python オブジェクトを操作するときは、そのオブジェクトがどの型に属しているか、また、これらの特性により操作が失敗するか、または望ましい効果が得られないかを念頭に置く必要があります。: Python が変数を検索するとき、検索が完了するか見つからない場合にのみ、 例外がトリガーされます。これについては、私のブログ投稿の 1 つを参照してください。 Python:スコープ(スコープ)とLEGB
UnboundLocalErrorNameError
: この問題は最も一般的であり、説明するのが最も難しい問題です。なぜなら、ELGB の順序に従って変数が検索されることを私たちは常に当然のことと考えているからです。実際、私たちの理解は間違っているのではありません。それを無視します 1 点: 、関数コードセグメントに代入ステートメントがない場合、この問題は発生しませんが、代入ステートメントが出現するとエラーが報告されるのはなぜですか? これは Python のスコープに関連しています。上記の記事で述べたように、Python のスコープは動的ではなく静的であることがスクリプト ファイルのインデントから確認できるため、コード内では次のようになります。リーリー
In
inside
中, 已经有了赋值语句, 所以对于x
,他已经不会从enclosing
或者global
甚至bulitin
里面去查找, 它已经被认定在local
域了, 只是这个值并没有和真正的对象'inside'
建立起绑定关系, 因为代码没有运行到真正的赋值语句, 所以, 会触发这个UnboundLocalError
. 而为什么那个列表会可以那样做, 因为他们两个是完全不同的操作, 同样都是print(id(x))list的操作字节码是LOAD_DEREF
, 而字符串的操作字节码是LOAD_FAST
, 而x[:]=[1,2,3]/x='inside'分别对应的字节码又是STORE_SLICE+3
和STORE_FAST
, 前者是在原来的基础上修改, 而后者是重新指向新的对象, 而这两种方式的区别, 决定了,它们在构建函数时, 以怎样的形式存放x
, 这个就涉及到python函数
构建的原理了, 有兴趣可以看看源码中的object/ceval.c源码
, 这是虚拟机运行的原理, 关于这个问题可以简单看我另一篇文章, 比较简单将UnboundLocalError
: 魔法の UnboundLocalError: 割り当ての前にローカル変数 x が参照されたことについて話しましょうinside 関数で新しい変数 x を再割り当てしましたが、2 つの x のスコープが異なります。
UnboundLocalError は、内部スコープで初期化されていない変数を出力したために発生します。
詳細については、この説明を参照してください:
https://docs.python.org/2/faq...
基本的に、Lin_R はそれを非常に明確にしました。
外部機能と内部機能のドメインは異なります。 inside 関数で x に値を代入したため、変数 x が inside 関数で使用されると、x は inside のローカル ドメインにあるとみなされます。このとき、x は他のフィールドの値を使用しません。したがって、print(x) を実行すると、x には初期化された値がないため、エラーが発生します。 C では定義済みだが割り当てられていない変数を使用することができますが、Python ではこれが許可されません。
Python3 には、この問題を解決する非ローカルなステートメントがあります。
リーリーグローバル ドメインには x 変数がないため、現時点では
global
ステートメントを使用できないことに注意してください。