在理解使用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
导致了这两种不同输出的代数
答案 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
>>>