【问题标题】:Difference between list definitions in PythonPython中列表定义之间的区别
【发布时间】:2017-12-07 01:08:15
【问题描述】:

在理解使用 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 的理解,两个不同的列表定义应该会产生相同的输出,但我似乎遗漏了一些导致上述情况的细节。

我的问题是

以下2种列表定义到底有什么区别

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

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

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

【问题讨论】:

    标签: python arrays python-2.7


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        [['_']*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
        >>> 
        

        【讨论】:

          猜你喜欢
          • 2020-10-01
          • 1970-01-01
          • 2011-08-18
          • 2012-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-26
          • 1970-01-01
          相关资源
          最近更新 更多