0

ほとんどの人にとって、これはおそらく常識ですが、私はこれを理解するのが非常に難しいと感じています。次のような関数を作成する場合

def one():
    x=1
    y=2
    z=3
    h=33
    j=454
    l=353
    m=898

次に、別の関数def two():があり、def one()の変数をdef twoに使用したいとします。また、def two()に2つの新しい変数を作成します。どうすればそれができますか。

次に、3番目の関数def three()があるとしましょう。def1とdef2の変数をdef3にどのように使用しますか?私が使用している方法は非常に非効率的で、おそらく必要以上のことをしています。私がしていることは、def twoで、def1からdeftwoのパラメーターにすべての変数を追加し、次に関数2のdefで関数1を呼び出します。これにはSOに多数のスレッドがあることを知っており、調べました。それらの多くを通して、彼らは単にそれをしません。彼らは私がなじみがなく、したがって理解できない非常に具体的で高度なコードを使用しています。私の例は非常に単純明快で、答えられれば多くの新参者に役立つと確信しています。ありがとう!

編集:私は、私がよく知らない高度なコードを使用することになる「単純な」方法を望んでいません。わかりやすい「効率的な」方法が欲しい。

4

5 に答える 5

3

最善の解決策は、コード(クラス、メソッド、継承)にオブジェクト指向パラダイムを採用することだと思います。

単純な関数を使用して、グローバル変数とローカルスコープのどちらを使用するかを選択できます。

于 2012-11-01T07:10:00.743 に答える
2

データは引数として関数に渡され、戻り値として関数から渡されます。関数の理想的なケースは、関数のスコープ外の変数にアクセスする必要がない場合です。

数が多い場合は、おそらくそれらをリストとして宣言し (管理しやすい)、それらを引数として関数に渡し、変換された結果として戻り値として関数の外に渡す必要がありますか?

于 2012-11-01T07:12:16.703 に答える
1

キーワードを使用して、次のようにグローバル変数を作成および変更できます。global

In [1]: def one():
   ...:     global a
   ...:     a = 1
   ...: 

In [2]: one()

In [3]: a
Out[3]: 1

ただし、これほど多くの (または場合によってはすべての) グローバル変数を持つことは、良い習慣とは見なされません。1 つのグローバルlistを宣言し、その中にすべての値を保持することができます。アンドリューの回答で概説されているように、関数の引数と戻り値の使用に固執するために最善を尽くす必要があります。

于 2012-11-01T07:14:26.297 に答える
0

何をしようとしているのかをまったく明確にせずに、これを行う簡単な方法を次に示します。

class One(object):
    x=1
    y=2
    z=3
    h=33
    j=454
    l=353
    m=898


class Two(One):
    n=42
    o=1337

print Two.x, Two.n  # 1, 42
于 2012-11-01T08:05:39.873 に答える
0

あなたが何を必要としているのかを理解したら、Pythonがあなたにもたらす最も簡単な方法が次だと思います->

class Helper:pass 

# use name space
def one(a):  
    a.x=1
    a.y=2
    a.z=3
    a.h=33
    a.j=454
    a.l=353
    a.m=898

def two(a):
    a.y=7

a=Helper()

one(a)
print(a.x,a.y)
two(a)
print(a.x,a.y)

#-------------------------------------------------------------------
# I think you have solution and dont need to read next lines :)
# next lines are just bonus ;)
#-------------------------------------------------------------------

# you could use more independent "namespaces"
b=Helper()
one(b)
print(b.y)
print(a.y)  # "namespace a" is unchanged

# if you like to see which attributes are defined you could use funciton dir
# (under python3 it is a little more complicated)
print(dir(a))
print(dir(b))

# please dont do next lines at home!!! :P:P:P (__builtins__ is special you could get unwanted results!) 
one(__builtins__)

print(x) # 
于 2012-11-01T08:41:40.050 に答える