2011-12-26 8 views
1

私は長年にわたってC/C++/Javaのような構文に晒されてきましたが、Pythonの変数が定義されているので、まったく混乱してしまいました。誰もがqの中で言及された3つの間に違いが何かを記述することができますか?Python:グローバル変数と接頭辞「self」を持つ変数との違いは何ですか?ローカル変数とは異なりますか?

+1

最初。 Pythonの変数は定義されていません。それはあなたの問題の大部分であるかもしれません。あなたは真剣に "グローバル"対 "ローカル"と混乱していますか?そうは思わない。たとえば、**あなたが持っている**具体的な**質問が何を知っていると思うかを書き留めてください。あなたが混乱していることの詳細を記入すると助けになります。コードサンプルは、混乱しているコードに関する特定の事項を記載している場所で役立ちます。 –

+0

私は主に、グローバルとローカルの領域で "自己"がどのようにピクチャに入ってくるのか混乱しています。 –

+0

変数を作成するための用語は「作成」です。代入文は変数を作成します。 –

答えて

3

selfは、C++とJavaのthisのように動作します。 .演算子(C++では->)を使用してアクセスできるオブジェクトへの参照を取得します。

Pythonでは、インスタンス変数にアクセスする唯一の方法は、明示的にselfです。インスタンス変数はではなく、は、ローカル変数またはグローバル変数と同じ「通常」のスコープに配置されます。

+0

ちょっと、あなたは、ローカル変数/グローバル変数を使ってインスタンス変数を記述することはできません。あるいは、コンテキストに応じて* local *か* globalのいずれかになります。 –

+2

@KaitlynMcmordie:もしPythonで 'a = 10'を実行すると、常に' a'という名前のローカル変数が設定されます。C++では、 'a'がどのように宣言されたかによって、ローカル変数またはインスタンス変数を設定することができます。 'self.a = 10' – hugomg

+0

'インスタンス変数 'という名前が矛盾しているように私はまだ混乱しています...インスタンス変数が更新されても少なくとも1つのインスタンスがそれを変更したときに、その特定のクラスの\ *すべて\ *ランタイムインスタンシエーションを介して、インスタンスに依存しない変数を呼び出す方が適切ではないでしょうか?それとも基本的には静的変数と呼んでいないのですか? –

6

グローバル変数は、それだけではなく、グローバルにアクセス可能な変数です。ローカル変数は、単一の関数定義で使用される一時変数など、現在のスコープでしかアクセスできない変数です。インスタンス変数(たとえば、self.接頭辞を使用する場合)は、オブジェクトの特定のインスタンスに関連付けられたデータです。もちろん、object.xを使用してオブジェクトの外部にあるインスタンスオブジェクトを参照することもできます。objectはそのオブジェクトへの参照です。

変数に接頭辞selfがある場合、変数はローカルでもグローバルでもありません。これは、オブジェクトの特定のインスタンスの構成の一部です。大まかに言って、インスタンス変数は特定のオブジェクトのプロパティを表します。

次の例では、lxはローカル変数であり、greetのローカル変数です。 gxは、モジュールのどこにでもアクセス可能なグローバル変数です。ixは、オブジェクトの各インスタンスに固有の値を持つインスタンス変数です。オブジェクト定義の内部で参照される場合は、接頭辞がselfixを参照し、オブジェクト参照の接頭辞を持つオブジェクトの外側にある場合は参照します。

gx = "hello" 
class Foo: 
    def __init__(self, who): 
     self.ix = who 
    def greet(self): 
     lx = "%s, %s" % (gx, self.ix) 
     return lx 

foo = Foo("world") 
print foo.greet() 
print foo.ix 
2

時には第一原理に戻って本当に便利です:

私たちはその「スコープ」(またはコンテキスト)を参照しているローカルまたはグローバル変数であることについて話すとき。関数内の変数は、関数に対してローカルとみなされます。ここでSwaroopの優れたガイド、 'A Byte of Python' からのイラストです:

x = 50 

def func(x): 
    print('x is', x) 
    x = 2 
    print('Changed local x to', x) 

func(x) 
print('x is still', x) 

出力:

xは50

変更ローカルX X

2にあることは、まだ50です

次にグローバル変数は、内部と機能の外部コンテキストを横断する方法を示す図である。

x = 50 

def func(): 
    global x 

    print('x is', x) 
    x = 2 
    print('Changed global x to', x) 

func() 
print('Value of x is', x) 

出力:

xはグローバルXに変更50

あります2

xの値は2

これはすべてです。

私たちがPythonのオブジェクト指向プログラミングの側面を利用する場合、 '自己'という概念が関連します。クラスインスタンスとインスタンスは「オブジェクト」とみなされ、「自己」とみなされます。接頭辞は、私たちのコードがローカル/グローバル変数を参照するのか、オブジェクトの属性を参照するのかを区別することができます。

もう一度、コンセプトは、禅のような単純さでSwaroopで説明されます。

関連する問題