gpt4 book ai didi

python - Python 中列表定义的区别

转载 作者:行者123 更新时间:2023-11-28 21:41:21 25 4
gpt4 key购买 nike

在理解使用 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

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

最佳答案

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

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

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

关于python - Python 中列表定义的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44891076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com