簡體   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