Python中列表定义的区别

时间:2017-07-03 17:23:10

标签: python arrays python-2.7

在理解使用8个皇后的回溯时,我遇到了python中列表定义的问题

def place(board, row, column):
    for c in range(column):
        if board[c]==row:
            return False
        elif abs(board[c]-row) == abs(c-column):
            return False
    return True


def Queens(board, column):
    #do stuff
    for row in range(8):
        if place(board, row, column):
            board[column]=row
            if column==7:
                return True
            else:
                if(Queens(board, column+1)):
                    return True
                else:
                    #backtracking
                    board[column]= -1 
    if row==8:
        return False

def HailHydra(board):
    print("------------------****------------------")
    data = [['_']*8 for _ in xrange(8)]

    for i in xrange(8):
        data[i][board[i]]='Q'
    for i in xrange(8):
        print data[i]

def main():
    position = 2
    board = [-1]*8
    if(position>=0 and position<8):
        board[0]=position

        if(Queens(board, 1)):
            HailHydra(board)
            return True
        else:
            print "Cant have board with initial queen at:", position
            return False
    else:
        print "Invalid input"
        return False

main()

此代码导致输出

------------------****------------------
['_', '_', 'Q', '_', '_', '_', '_', '_']
['Q', '_', '_', '_', '_', '_', '_', '_']
['_', '_', '_', '_', '_', '_', 'Q', '_']
['_', '_', '_', '_', 'Q', '_', '_', '_']
['_', '_', '_', '_', '_', '_', '_', 'Q']
['_', 'Q', '_', '_', '_', '_', '_', '_']
['_', '_', '_', 'Q', '_', '_', '_', '_']
['_', '_', '_', '_', '_', 'Q', '_', '_']

在上面的代码中我们交换

data = [['_']*8 for _ in xrange(8)]

主要功能

中的这一行
data = [['_']*8]*8

输出变为

------------------****------------------
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']

根据我对python的理解,两个不同的列表定义应该产生相同的输出,但似乎我遗漏了导致上述情况的一些细节。

我的问题是

以下两种类型的列表定义之间究竟有什么区别

1.  [['_']*8 for _ in xrange(8)]

2.  data = [['_']*8]*8

导致了这两种不同输出的代数

3 个答案:

答案 0 :(得分:2)

通过键入[['_']*8]*8,您将创建相同列表实例的列表:

ls = [['_']*8]*8
ls[5][5] = 'Q'
print ls

在这里你可以看到'Q'被放置了8次。

答案 1 :(得分:2)

第一个构建了8个单独列表的列表。第二个构建一个包含相同列表 8次的列表。

答案 2 :(得分:1)

[['_']*8 for _ in xrange(8)]data = [['_']*8]*8产生的输出实际上完全相同,只要它们不被触及

>>> a = [['_']*8 for _ in xrange(8)]
>>> b = [['_']*8]*8
>>> a == b
True

但正如@hurturk和@Blotosmetek正确地说的那样,b实际上是一遍又一遍的相同列表的副本。 b中一个列表的任何更改都会对b中的其他列表产生相同的影响。

而a是独立列表的列表。

>>> a[1][1]='Q'
>>> b[1][1]='Q'
>>> a == b
False
>>>