62

Python で関数外のローカル関数変数にアクセスしようとしています。たとえば、

bye = ''
def hi():
    global bye
    something
    something
    bye = 5
    sigh = 10

hi()
print bye

上記は正常に機能します。を使用せずにbye外部にアクセスできるかどうかを知りたいので、試してみました:hi()global bye

def hi():
    something
    something
    bye = 5 
    sigh = 10
    return

hi()
x = hi()
print x.bye 

上記は を与えAttributeError: 'NoneType' object has no attribute 'bye'ます。

次に、試しました:

def hi():
    something
    something
    bye = 5
    sigh = 10
    return bye 
hi()
x = hi()
print x.bye

今回はエラーすら出ません。

では、グローバルを使用せず、変数も出力せずにbye、関数 ( ) の外にあるローカル関数変数 ( ) にアクセスする方法はありますか? (質問は、以下の @hcwhsa のコメントの後に含めるように編集されました。hi()sighsigh

4

5 に答える 5

123

これらの行に沿って何かを行うことができます(テストしたとき、Python v2.7.17 と v3.8.1 の両方で機能しました)。

def hi():
    # other code...
    hi.bye = 42  # Create function attribute.
    sigh = 10

hi()
print(hi.bye)  # -> 42

関数は Python のオブジェクトであり、任意の属性を割り当てることができます。

thisこの種のことを頻繁に行う場合は、装飾された関数への各呼び出しに引数を追加する関数デコレータを作成することで、より一般的なものを実装できます。

selfこの追加の引数は、関数の名前を定義の残りの部分に明示的に埋め込む (ハードコードする) 必要なく、関数自身を参照する方法を提供します。これは、クラス メソッドが最初の引数として自動的に受け取るインスタンス引数に似ています。混乱を避けるために別の名前を付けますが、self引数と同様に、任意の名前を付けることができます。

そのアプローチの例を次に示します。

def add_this_arg(func):
    def wrapped(*args, **kwargs):
        return func(wrapped, *args, **kwargs)
    return wrapped

@add_this_arg
def hi(this, that):
    # other code...
    this.bye = 2 * that  # Create function attribute.
    sigh = 10

hi(21)
print(hi.bye)  # -> 42

ノート

これは、クラス メソッドでは機能しません。selfメソッドの名前の代わりに、既にメソッドに渡されている、慣例によって名前が付けられたインスタンス引数を使用するだけです。を介してクラスレベルの属性を参照できますtype(self)クラスにいる場合の関数の属性を参照してください。

于 2013-10-11T21:42:39.077 に答える
10

問題は、 x を文字列として設定した後に print x.bye を呼び出していたことです。実行するx = hi()と、hi() が実行され、x の値が 5 に設定されます (bye の値。bye 変数自体への参照として x の値は設定されません)。例: bye = 5; x = bye; bye = 4; print x;4 ではなく 5 を出力します

x = hi()また、hi() を 2 回実行する必要はありません。実行するだけで済みhi();x=hi()ます (以前の方法では、hi() を実行し、結果の値 5 で何もせず、同じ hi() を再実行し、 5 の値を x 変数に保存します。

したがって、完全なコードは

def hi():
    something
    something
    bye = 5
    return bye 
x = hi()
print x

複数の変数を返したい場合は、必要に応じてリストまたは辞書を使用することもできます。

元:

def hi():
    something
    xyz = { 'bye': 7, 'foobar': 8}
    return xyz
x = hi()
print x['bye']

http://docs.python.org/2/tutorial/datastructures.html#dictionariesの python 辞書の詳細

于 2013-10-11T19:58:14.910 に答える
2

この行に沿って何かを行うことができます:

def static_example():
   if not hasattr(static_example, "static_var"):
       static_example.static_var = 0
   static_example.static_var += 1
   return static_example.static_var

print static_example()
print static_example()
print static_example()
于 2016-03-16T21:41:19.510 に答える
1
 def hi():
     bye = 5
     return bye  

print hi()
于 2017-01-10T09:04:49.127 に答える