繁体   English   中英

当它是列表,整型或字符串时,为什么输出不相同?

[英]Why are the outputs not the same when it is either a list, int or string?

从我的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

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

因此,在您的示例中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM