2016-10-16 7 views
0

2つのクラスに問題があります。これは、私はそれが役立つかどうここクラスメソッドは、他のクラスの変数を予期しない副作用として変更できますか?

print(player1.getPosSize())  
ball.setPos(windowWidth, [player1.getPosSize(), player2.getPosSize()], 
    [player1.getSpeed(), player2.getSpeed()])  
print(player1.getPosSize()) 

は、メソッド定義されている私のメインループの中で書いたものである

(ボールクラス)

def setPos(self, windowWidth, playerPosSizes, playerSpeed):  
    playerPosSizes[0].append(playerSpeed[0]) 
    playerPosSizes[1].append(playerSpeed[1]) 
    playerPosSizeSp = playerPosSizes 

(プレイヤークラス)

def getPosSize(self): 
    return self.posSize 

def getSpeed(self): 
    return self.ysp 

これは出力です:

[80, 285.0, 40, 150]  
[80, 285.0, 40, 150, 0.0] 

したがって、getPosSize()が返すリストが変更されます。 getPosSizeは、クラスプレーヤーにのみ存在するリストposSizeを返すので、これは奇妙です。そして私は他のクラスのメソッドでposSizeのVALUEを使用しています。私はどのように変更することができますposSizeリストが表示されません!私はgetPosSizeと呼ぶと、posSizeのコピーを手に入れますか?ですから、ボールクラスのsetPosメソッドでそのコピーを使用すると、元のposSizeは変更されません。

コードが混乱していると私は本当にすみません。関連する部分だけを含めるようにしました。

+0

ball.posSize = player1.posSizeを変更するには、コードのエヴリーラインの前にexrta 4スペースを追加する必要があります。 SOに貼り付ける前にエディタでそれを行う方が簡単です。 – furas

+0

'='を使うと、pythonはリストのコピーを作成しません。メモリ内の同じデータへの参照が2つあります。 'new_list = other_list [:]'または 'new_list = other_list.copy()'が必要です – furas

+0

あなたのコードが何をしているかは完全には分かりません。あなたの問題に焦点を当てた[mcve]を投稿すると助けになります。しかし、 'getPosSize'を呼び出すことは、' self.posSize'(リストであると仮定します)のコピーを作成しない**、実際のリストオブジェクトへの参照を返します。リストのコピーが必要な場合は、例えば 'return self.posSize [:]' –

答えて

0

listなどのオブジェクトは、アクセスできるものすべてで変更できます。つまりgetPosSize()メソッドがlistを返している場合は、同じリストに影響する変更を加えることができます。

class One(object): 
    CLS_LST = [1, 2, 3] 
    def __init__(self): 
     self.lst = [4, 5, 6] 

    def get_cls_pos(self): 
     return One.CLS_LST 

    def get_pos(self): 
     return self.lst 

class Two: 
    def do_smthng(self, data): 
     data.append(-1) 



a = One() 

print('This is One.CLS_LST: {}'.format(a.CLS_LST)) 
print('This is a.lst: {}'.format(a.lst)) 
b = Two() 
print('Calling b do something with One.CLS_LST') 
b.do_smthng(a.get_cls_pos()) 
print('This is One.CLS_LST: {}'.format(a.CLS_LST)) 
print('Calling b to do something with a.lst') 
b.do_smthng(a.get_pos()) 
print('This is a.lst: {}'.format(a.lst)) 

このコードの結果が出力されます:

This is One.CLS_LST: [1, 2, 3] 
This is a.lst: [4, 5, 6] 
Calling b to do something with One.CLS_LST 
This is One.CLS_LST: [1, 2, 3, -1] 
Calling b to do something with a.lst 
This is a.lst: [4, 5, 6, -1] 

あなたが本当にリストのコピーを渡したい場合は、return list[:]を使用するようにしてください。

+0

これは分かりませんでした。それを編集し、今のところうまくいくようです。どうもありがとうございました! – Slibbfalusken

0

同じリストへのコードリンクで2つの変数のように見えるので、一方を変更するともう一方の変数が変更されます。

ball.posSize = player1.posSizeのような操作をしていませんか?

「はい」の場合は、同じリストへの2番目の参照を作成しました。この問題を解決するには

、SO ypuにball.posSize = player1.posSize[:]

関連する問題