2016-08-15 6 views
-1

私はPythonで次のクラスを定義します。Classインスタンスの奇妙な振る舞い - 内部変数の更新時

class test(): 
    def __init__(self): 
     self.x = 0 
     self.y = self.x ** 2 
    def check(self): 
     self.x = self.x + 1 
     print self.x 
     print self.y 

ここでは、2つの内部変数xとyがあります。初期化では、$$ y = x^2 $$を設定しています。今度は、メソッドcheck()を呼び出すたびに、xの値を1ずつ増やします(self.x = self.x + 1)。しかし、私が値を印刷するとき、xは1だけ増分されますが、yは常に0のままです。 (それはx^2になるべきではない?)どうしたの?

+0

何も問題はありません。インスタンスを初期化した後に 'self.y'を変更することはないので、常に同じ値を保持します。 – kindall

+0

Ned Batchelderの「[Pythonの名前と値についての事実と誤解](http://nedbatchelder.com/text/names1.html)」(26分[PyCon US 2015からのビデオ](https:// www。 youtube.com/watch?v=_AEJHKGk9ns))では、Pythonの変数や代入文が他のほとんどの言語と全く同じように機能しないというクラッシュコースがあります。 (具体的には、名前は常に値を参照し、_neverは式や他の名前を参照します)。 –

答えて

2

self.yは、の最初のクラスのインスタンスを作成するときにのみ割り当てられます。関数を呼び出すたびに更新されるわけではありません。 def __init__(self):関数は、
myVar = new test()の場合にのみ実行されるため、yの値は1回のみ割り当てられ、更新されます。

あなたのコードはする必要があります:

class test(): 
    def __init__(self): 
     self.x = 0 
     self.y = self.x ** 2 
    def check(self): 
     self.x = self.x + 1 
     self.y = self.x ** 2 
     print self.x 
     print self.y 
2

Pythonは一つのセル(変数)を更新すると、自動的に他の値に影響を与えることができ、スプレッドシートのようではありません。

コードはself.yの値を決して変更しません。それを行うためにいくつかのコードを追加する必要があります。あなたはまた、プロパティとしてyを実装することができます望んでいたし、それはその平方根にxを設定している場合は

class Test(object): 
    def __init__(self): 
     self._x = 0 
     self.y = 0 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = value 
     self.y = value ** 2 

    def check(self): 
     self.x = self.x + 1 
     print self.x, self.y 

>>> t = Test() 
>>> for i in range(5): 
...  t.check() 
1 1 
2 4 
3 9 
4 16 
5 25 

>>> t.x = 200 
>>> t.y 
40000 

propertiesを使用します。

def check(self): 
     self.x = self.x + 1 
     self.y = self.x ** 2 
     print self.x 
    print self.y 

しかしその動作を実装する方法がありますそれが更新されたとき。これは、xが `y`の平方根であり、その逆の関係を強制するでしょう。

0

変数yは、インスタンス化されてコードで更新されない場合にのみ設定されます。

xを更新および/またはインクリメントする別の方法があり、値を確認する方法とともに、必要に応じてyを調整する必要があります。

class test(): 
    def __init__(self): 
     self.x = 0 
     self.y = 0 
    def update_x(self, x): 
     self.x = x 
     self.y = x ** 2 
    def increment_x(self): 
     self.x += 1 
     self.y = self.x ** 2 
    def check(self): 
     print self.x 
     print self.y