Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么列表分配中的列表会重复自身?班级_Python_Arrays_List_Class - Fatal编程技术网

Python 为什么列表分配中的列表会重复自身?班级

Python 为什么列表分配中的列表会重复自身?班级,python,arrays,list,class,Python,Arrays,List,Class,使用Python和类,我试图制作一个类似于战舰的游戏,主要是为了练习。所以我制作了一个游戏板对象,你可以“看到”它,然后“改变”它。(稍后我将在中合并“create”和init) 但奇怪的是,我的“更改”应用于每一行……下面是代码: class Board: 'Game Board' topMarkers = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ') sideMarkers = list(range(0, 26)) def __in

使用Python和类,我试图制作一个类似于战舰的游戏,主要是为了练习。所以我制作了一个游戏板对象,你可以“看到”它,然后“改变”它。(稍后我将在中合并“create”和init)

但奇怪的是,我的“更改”应用于每一行……下面是代码:

class Board:
    'Game Board'
    topMarkers = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    sideMarkers = list(range(0, 26))


    def __init__(self,h,w): #Makes the map
        self.height = h
        self.width = w


    def create(self): #Makes a map for displaying
        wave = '~'
        self.row = []
        self.column = []
        #self.column = wave * self.width # If width is 4, column is now '~~~~'

        for c in range(self.width):
            self.column.append(wave)


        raw_input(self.column)

        for r in range(self.height): #
            self.row.append(self.column)

        raw_input(self.row)

    def showGrid(self):

        print self.row

    def changeRow(self, y, x):
        self.row[1][2] = "Test"







yourShipsMap = Board(4,3)

theirShipsMap = Board(4,7)


theirShipsMap.create()

theirShipsMap.changeRow(2,2)
theirShipsMap.showGrid()
当我运行它时,它不仅在第一个列表第二个索引中编写“Test”,而且在每个列表第二个索引中编写“Test”。知道它为什么这么做吗

我讨厌当我停止一起编程一个月而忘记一切的时候

for r in range(self.height): #
    self.row.append(self.column)
您不断追加相同的列表对象,如果在一行中进行更新,将在每一行中看到该对象

试试这个:

self.row = [['~'] * self.width for r in xrange(self.height)]
这将创建一个列表列表,其中所有元素相互独立

您不断追加相同的列表对象,如果在一行中进行更新,将在每一行中看到该对象

试试这个:

self.row = [['~'] * self.width for r in xrange(self.height)]

这将创建一个列表,其中所有元素彼此独立。

您只创建一列,然后将其附加到行中。将一个列表附加到另一个列表不会生成新的副本,而是反复使用同一个列表

使用
[:]
切片语法或
列表()
调用来追加副本:

for r in range(self.height): #
    self.row.append(self.column[:])
以下是发生在您身上的一个例子:

>>> column = [1, 2]
>>> row = []
>>> row.append(column)
>>> row.append(column)
>>> column[0] = 'foobar'
>>> row
[['foobar', 2], ['foobar', 2]]
另一方面,如果我们使用副本,当我们更改原件时,副本不会更改:

>>> row = []
>>> row.append(list(column))
>>> row.append(column[:])
>>> row
[['foobar', 2], ['foobar', 2]]
>>> column[0] = 1
>>> row
[['foobar', 2], ['foobar', 2]]

在上面的示例中,我使用了两种方法来创建原始列列表的(浅)副本。如果需要创建深度副本(包含列表或dict等其他可变项的列表),请改用。

只创建一列,然后将其附加到行中。将一个列表附加到另一个列表不会生成新的副本,而是反复使用同一个列表

使用
[:]
切片语法或
列表()
调用来追加副本:

for r in range(self.height): #
    self.row.append(self.column[:])
以下是发生在您身上的一个例子:

>>> column = [1, 2]
>>> row = []
>>> row.append(column)
>>> row.append(column)
>>> column[0] = 'foobar'
>>> row
[['foobar', 2], ['foobar', 2]]
另一方面,如果我们使用副本,当我们更改原件时,副本不会更改:

>>> row = []
>>> row.append(list(column))
>>> row.append(column[:])
>>> row
[['foobar', 2], ['foobar', 2]]
>>> column[0] = 1
>>> row
[['foobar', 2], ['foobar', 2]]

在上面的示例中,我使用了两种方法来创建原始列列表的(浅)副本。如果需要创建深度副本(包含列表或dict等其他可变项的列表),请改用。

yes。因为你们有一行相同的对象,当它被改变时,它们将保持一个值。好吧,我想做一个列表列表,这样我可以做一个X,Y方案。是否要附加副本而不是引用或其他内容?是的。因为你们有一行相同的对象,当它被改变时,它们将保持一个值。好吧,我想做一个列表列表,这样我可以做一个X,Y方案。无论如何,要附加一个副本而不是引用或其他什么吗?太棒了,我不知道切片操作符是这样工作的。现在工作真棒,我不知道切片操作员是怎么工作的。现在工作