我的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 :(得分:0)
这是因为,当您将变量声明为list时,它会存储对象的引用(内存地址)。当您通过 index 访问变量时,两个对象都会更新同一列表对象的值。但是在没有索引的情况下进行初始化时情况并非如此。在这种情况下,新对象被初始化为变量。
因此在你的例子中:
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 ,你的另一个变量仍将保留旧对象的值。
答案 1 :(得分: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
?