2016-10-18 24 views
0

は、我々はfoo()Pythonでの参照渡しをどのようにシミュレートできますか?

def foo(): 
    foo.a = 2 

foo.a = 1 
foo() 

>> foo.a 
>> 2 

機能は、このニシキヘビですか、私はそのようなリストのように変更可能なオブジェクトに変数をラップする必要があるとしましょうか?

例:

a = [1] 

def foo(a): 
    a[0] = 2 
foo() 

>> a 

>> 2 
+1

を?呼び出しスコープ内のオブジェクトを変更しますか?グローバルスコープでは?他に何か? –

+0

グローバルスコープでも変更が反映されるように変数を変更したいと思います。 また、私は 'function_name.a'(Eg1)が何を意味しているのか、それはなぜ可変オブジェクトをシミュレートするのですか? – yask

+0

この項目もチェックしてください:http://stackoverflow.com/questions/39975659/python-27-how-to-fix-store-a-value-to-a-method-to-preserve-its-interface/39975900#39975900 – jbndlr

答えて

1

あなたは名前aがグローバル変数であることをあなたの関数を伝えるためにglobalキーワードを使用する「の変更も同様にグローバルスコープで行われるように変数を変異させたい」ので。つまり、関数内のaへの割り当ては、グローバルスコープに影響します。 global宣言がなければ、関数内のaに新しいローカル変数が作成されます。

>>> a = 0 
>>> def foo(): 
...  global a 
...  a = 1 
... 
>>> foo() 
>>> a 
1 
+0

'foo.a'が' foo'が関数名であるところが何を意味するのかについても説明できますか?例1(質問に記載)は可変変数のように機能しますか? – yask

+0

@yask:Python関数は呼び出し可能なオブジェクトです。オブジェクトなので、ドット表記法( 'foo.a = 2'など)を使って属性を追加することができます。これは合法ですが、一般的ではありません(まったく珍しいことではありません)。あなたが望むものと状態をペアにする必要がある場合は、クラスを宣言することです。 –

+0

@StevenRumbalski '' a''はあなたの例では属性ではありませんが、これは誤解を招く可能性があります。 – jbndlr

0

クラス(多分ビットやり過ぎ)を使用してください:あなたの目標は何ですか

class Foo: 
    def __init__(self): 
     self.a = 0 

def bar(f): 
    f.a = 2 

foo = Foo() 
foo.a = 1 
bar(foo) 
print(foo.a) 
+0

'Foo .__ init__'で' self.a = 0'を意味すると思いますか? –

+0

修正。私のコードを修正しました。 – Oxben

関連する問題