为什么输出不是一个列表,int或字符串?

为什么输出不是一个列表,int或字符串?

问题描述:

一些代码从我的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 

这是因为,当您声明变量为列表时,它存储对象的引用(内存地址)。当您通过索引访问变量时,两个对象都会更新同一个列表对象的值。但是,如果没有索引进行初始化,情况并非如此。在这种情况下,一个新的对象被初始化为变量。

因此,在你的例子之一:

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,而您的其他变量仍然会保留旧对象的值。

这是有点不清楚你问什么,但我认为这是因为你实际上没有看到变量如何相关。

你有三个语句会在这里:

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