为什么输出不是一个列表,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_init
和self.background_pos
适用于同一列表中的参考。因此,当您更改一个列表中的值时,它将反映在保存它的两个变量中。
但是,这是不是真的在具体例2:
self.background_pos_init = 0
self.background_pos = self.background_pos_init
两个self.background_pos_init
和self.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
?