2017-08-07 88 views
0

一些代碼從我的pygame遊戲中複製(並修改)。但同樣的問題發生,我不明白。爲什麼background_pos_init輸出在列表中是不同的,而且它是一個整數或字符串?爲什麼輸出不是一個列表,int或字符串?

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 

如果我改變價值觀,以 '海峽',輸出是:

============== 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適用於同一列表中的參考。因此,當您更改一個列表中的值時,它將反映在保存它的兩個變量中。

但是,這是不是真的在具體例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

這是有點不清楚你問什麼,但我認爲這是因爲你實際上沒有看到變量如何相關。

你有三個語句會在這裏:

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)顯示16?如果我們更改代碼:

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

相關問題