3
>>> def nil():
...     ss='nil'
...     print ss
... 
>>> nil()
nil
>>> nil.ss='kk'
>>> nil()
nil
>>> print nil.ss
kk

すべてがPythonのオブジェクトであることがわかっているので、関数もオブジェクトです。関数に格納されている'ss'変数の値を変更したいので、nil.ssを使用して値を変更しようとしましたが、変更しませんでした。 t変更..両方の「ss」の違いは何ですか?

4

6 に答える 6

4

1つ目ssは、関数の内部変数です。2つ目は、関数の属性です。それらは同じオブジェクトを参照しません。

ただし、これを行う方法は次のとおりです。

>>> def apple():
    if not hasattr(apple, 'ss'):  # This way it'll only be set inside the function once
        apple.ss = 'nil'
    return apple.ss

>>> apple()
'nil'
>>> apple.ss
'nil'
>>> apple.ss = 'kk'
>>> apple.ss
'kk'
>>> apple()
'kk'
于 2012-07-09T19:17:09.190 に答える
3

関数はオブジェクトですがss、クラスにあるという意味ではメンバー変数ではありません。これは関数の本体で定義されたローカル変数であり、外部からはアクセスできません。それを変更する唯一の正しい方法は、関数の実装を変更することです。

于 2012-07-09T19:18:02.377 に答える
1

関数のss本体内に作成するものは、一時変数にすぎません。そのコード行が実行されるまで存在せず、ブロックの終わりに達すると存在しなくなります。

ss関数で作成するものは、関数の属性です。これで、2つの異なる名前の変数ができましssたが、それらは互いに何の関係もありません。

于 2012-07-09T19:22:30.613 に答える
1
def nil():
 ss='nil'

これは、関数で定義されnil.ssた変数を指していないためです。ssnil

nil.ssこれssで、はオブジェクトの属性になりnilます。

nil.ssss内部nil()は完全に異なります。

>>> def nil():
    ss='foo'
    return ss

>>> nil.ss='bar'
>>> foo=nil()
>>> bar=nil()
>>> nil.ss
'bar'
>>> foo
'foo'
>>> bar
'foo'
于 2012-07-09T19:19:08.470 に答える
0

質問の他の部分に答えるにはss、関数の外部からローカル変数を変更することはできません。関数が実行されているとき以外は存在しません。

于 2012-07-09T19:22:23.267 に答える
0

コンパイラモジュールを使用してコードを変更できます。これにより、任意のPythonコードをテキストとしてロードし、それを抽象構文ツリーに解析し、変更を加えてから、再コンパイルすることができます。その後、追加の変更を加えてコードを実行できます。

http://docs.python.org/library/compiler.html

Python 3.0で非推奨になっているため、使用することはお勧めしませんが。他の方法ではモジュールを非推奨にしないため、3.0でこれを行う他の方法があるかもしれません。

本当に尋ねなければなりません。あなたが書き込もうとしているこのメソッドで解決しようとしている奇妙な奇妙なシナリオは何ですか?必要なことが何であれ、はるかに簡単な方法で実行できる可能性があります。関数へのパラメーター、またはニーズに合わせて設計したクラス構造のいずれかを使用します。

于 2012-07-09T19:47:44.457 に答える