最初のコード:
操作結果:
2 番目のコード:
私の質問は次のとおりです: 最初のコードで出力される 2 つの結果は異なるのに、2 番目のコードで出力される結果は同じなのはなぜですか?特に 2 番目のコード部分は、関数内の append コマンドが外部のグローバル変数を変更できるのはなぜでしょうか。最初のコードではリストが再定義されていますが、外部グローバル変数は変更できません。その理由は何でしょうか?
受け入れられた回答を読んだ後、私はまだ要点を見逃していたと思います。 まず、nums 変数はグローバル変数として定義されています。これは、この「.py」ファイルでは、すべてのクラスと関数がそれを使用できることを意味します。ただし、すべての変数もオブジェクトであり、オブジェクトは変更可能と不変更に分けられます。リストは変更可能なオブジェクトであるため、変更することができます。では、可変オブジェクトとは何でしょうか?これらは、メモリ内でのオブジェクトの生成と消滅に影響を与えることなくオブジェクトを操作できるものです。 x="234" と入力し、別の値を割り当てる場合は x="111" と入力します。実際、2 つの x はすでに 2 つのオブジェクトであり、覆われているだけです。つまり、x = x + "123" であり、x も新しいオブジェクトです。
それがリストの場合、x = [1,2,3]、今度はそれを操作します、x.remove(1)、その場合、x オブジェクトは依然として x オブジェクトですが、オブジェクトの値は変更されています
最初のコード: これは、異なるスコープで nums が再度割り当てられるため、グローバル変数 nums と nums_chang 関数の nums 変数は同じオブジェクトではなくなります。そのため、これらは異なるものになります。現時点では、nums_chang 関数の nums 変数はすでにローカル変数であり、この関数によってのみ使用されます
コードの 2 番目の部分: nums はリストおよび変数オブジェクトであるため、リストに対する操作はこのオブジェクトに影響を与えません。そのため、このオブジェクトは依然としてグローバル変数です。グローバル変数は関数内と外部の両方で使用されます。それを変更すると、グローバル変数の値も変更されます
最初に: スコープの問題については、最初に私の記事の 1 つを参照してください: Python: スコープと LEGB、まず比較できます 变量的查找有个基本的认识,然后我们能够看到, 因为有赋值语句, 所以nums ローカル スコープからのみ検索し、グローバル ドメインとは対話しません
变量
赋值语句
nums
2 番目: 1 番目に基づいて、nums.append(999)中的nums是从全局作用域找到的, 又因为用的是append方法, 这方法是直接用于源列表本身, 所以你看到全局的nums も更新されたことがわかります
nums.append(999)
全局作用域
append
関数が独自のスコープで変数を見つけられない場合、前のスコープに戻って変数を見つけます。これが 2 番目のスコープの作成方法です。 最初のものであれば、価値を与えたことは明らかです
受け入れられた回答を読んだ後、私はまだ要点を見逃していたと思います。
まず、nums 変数はグローバル変数として定義されています。これは、この「.py」ファイルでは、すべてのクラスと関数がそれを使用できることを意味します。ただし、すべての変数もオブジェクトであり、オブジェクトは変更可能と不変更に分けられます。リストは変更可能なオブジェクトであるため、変更することができます。では、可変オブジェクトとは何でしょうか?これらは、メモリ内でのオブジェクトの生成と消滅に影響を与えることなくオブジェクトを操作できるものです。 x="234" と入力し、別の値を割り当てる場合は x="111" と入力します。実際、2 つの x はすでに 2 つのオブジェクトであり、覆われているだけです。つまり、x = x + "123" であり、x も新しいオブジェクトです。
それがリストの場合、x = [1,2,3]、今度はそれを操作します、x.remove(1)、その場合、x オブジェクトは依然として x オブジェクトですが、オブジェクトの値は変更されています
最初のコード: これは、異なるスコープで nums が再度割り当てられるため、グローバル変数 nums と nums_chang 関数の nums 変数は同じオブジェクトではなくなります。そのため、これらは異なるものになります。現時点では、nums_chang 関数の nums 変数はすでにローカル変数であり、この関数によってのみ使用されます
コードの 2 番目の部分: nums はリストおよび変数オブジェクトであるため、リストに対する操作はこのオブジェクトに影響を与えません。そのため、このオブジェクトは依然としてグローバル変数です。グローバル変数は関数内と外部の両方で使用されます。それを変更すると、グローバル変数の値も変更されます
最初に: スコープの問題については、最初に私の記事の 1 つを参照してください: Python: スコープと LEGB、まず比較できます
变量
的查找有个基本的认识,然后我们能够看到, 因为有赋值语句
, 所以nums
ローカル スコープからのみ検索し、グローバル ドメインとは対話しません2 番目: 1 番目に基づいて、
nums.append(999)
中的nums
是从全局作用域
找到的, 又因为用的是append
方法, 这方法是直接用于源列表本身, 所以你看到全局的nums
も更新されたことがわかります関数が独自のスコープで変数を見つけられない場合、前のスコープに戻って変数を見つけます。これが 2 番目のスコープの作成方法です。
最初のものであれば、価値を与えたことは明らかです