2017-08-07 12 views
0

私のpygameゲームからコピーされた(そして変更された)コード。しかし、私は理解していない同じ問題が発生します。 background_pos_initの出力がリストであるときと、整数または文字列のときで、出力が異なるのはなぜですか?出力がリスト、整数、または文字列のときに同じでないのはなぜですか?

class Player(): 
    def __init__(self): 
     self.pos_init = [16] 
     self.pos = self.pos_init 


class Window(): 
    def __init__(self): 
     self.background_pos_init = [0] 
     self.background_pos = self.background_pos_init 

    def moveBackground(self): 
     self.background_pos[0] = self.background_pos_init[0] + player.pos[0] 

     print(self.background_pos) 
     print(self.background_pos_init) 


player = Player() 
window = Window() 

window.moveBackground() 

は出力が得られます。

============== RESTART: C:\Users\SAMP\Documents\Python\test.py ============== 
[16] 
[16] 
>>> 

class Player(): 
    def __init__(self): 
     self.pos_init = 16 
     self.pos = self.pos_init 


class Window(): 
    def __init__(self): 
     self.background_pos_init = 0 
     self.background_pos = self.background_pos_init 

    def moveBackground(self): 
     self.background_pos = self.background_pos_init + player.pos 

     print(self.background_pos) 
     print(self.background_pos_init) 


player = Player() 
window = Window() 

window.moveBackground() 

は出力が得られます。

============== RESTART: C:\Users\SAMP\Documents\Python\test.py ============== 
16 
0 

と私は 'STR' に値を変更した場合、出力:

============== RESTART: C:\Users\SAMP\Documents\Python\test.py ============== 
strstr 
str 

答えて

0

変数をリストとして宣言すると、オブジェクトの参照(メモリアドレス)が格納されるためです。変数によって変数にアクセスすると、両方のオブジェクトが同じリストオブジェクトの値を更新します。しかし、インデックスなしで初期化する場合はそうではありません。その場合、新しいオブジェクトが変数に初期化されます。あなたの一例ではそのため

self.background_pos_init = [0] 
self.background_pos = self.background_pos_init 

両方self.background_pos_initself.background_posは同じリストのための参照を保持しています。したがって、1つのリスト内の値を変更すると、それを保持する両方の変数に反映されます。

しかし、それは例2に真実ではありません:あなたは値を更新すると

self.background_pos_init = 0 
self.background_pos = self.background_pos_init 

両方self.background_pos_initself.background_posは0として値を保持している、にマッピングされているのはx = 0、値0を持つ新しいオブジェクトを言わせてオブジェクトx、そしてあなたの他の変数は依然として古いオブジェクトの値を保持します。

0

あなたが尋ねていることは少しはっきりしていませんが、変数がどのように関連しているかは実際には分かりません。

あなたはここで起こって3つの文がありますのは、これを単純化してみましょう

self.pos_init = 16 
self.background_pos_init = 0 
self.background_pos = self.background_pos_init + player.pos 

を。以下を考慮してください:

pos_init = 16 
background_pos_init = 0 
background_pos = background_pos_init + pos_init 

なぜprint(background_pos)が表示されるのですか?そして、私たちは、コード変更した場合:

pos_init = [16] 
background_pos_init = [0] 
background_pos[0] = 0 
background_pos[0] = background_pos_init[0] + pos_init[0] 
print(background_pos) 

をなぜこの表示[16]していますか?

そして、あなたが持っている場合:

pos_init = 'str' 
background_pos_init = 'str' 
background_pos = background_pos_init + pos_init 

なぜprint(background_pos)印刷strstrしていますか?

関連する問題