当它是list,int或string时,为什么输出不一样?

时间:2017-08-07 18:13:58

标签: python python-3.x

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

2 个答案:

答案 0 :(得分:0)

这是因为,当您将变量声明为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 ,你的另一个变量仍将保留旧对象的值。

答案 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