我使用Python 3.4.2创建了这个python程序。 在开始我定义了一个变量' best', 之后它可以在功能(我没有忘记'全球最佳')中进行更改。 每当它改变它的打印(' new best',best) 在程序结束时,它再次打印出最佳值,但它与上次更改时有所不同......这怎么可能???
大多数代码对于此(我猜)并不重要,但与最佳有关的行标有##########
from time import clock
size = [int(i) for i in input().split()]
step = [int(i) for i in input().split()]
clock()
best = [[0 for i in range(size[1])] for i in range(size[0])] ##########
best[0][0] = 1 ##########
lenbest=1 ##########
if step[0] == step[1]:
xstep = step[0]
moves = [[xstep,xstep],[-xstep,xstep],
[xstep,-xstep],[-xstep,-xstep]]
try:
best[xstep][xstep] ##########
posToGo = [moves[0]]
except: None
else:
moves = [[step[0],step[1]],[step[1],step[0]],
[-step[0],step[1]],[-step[1],step[0]],
[step[0],-step[1]],[step[1],-step[0]],
[-step[0],-step[1]],[-step[1],-step[0]]]
try:
best[step[0]][step[1]] ##########
posToGo = [moves[0]]
except: None
try:
best[step[1]][step[0]] ##########
posToGo.append(moves[1])
except: None
def attempt(board,posToGo,step):
currentMoves = []
for pos in posToGo:
currentMoves.append([pos])
for move in moves:
try:
x = pos[0]+move[0]
y = pos[1]+move[1]
if x>-1 and y>-1 and not board[x][y]:
currentMoves[-1].append([x,y])
except:None
currentMoves.sort(key=len)
for move in currentMoves:
nboard = board
nboard[move[0][0]][move[0][1]] = step
attempt(nboard,move[1:],step+1) ########## Note that i'm calling a function within itself
if step>lenbest: ##########
print("new best with pathlength",step-1,"after",clock(),"secconds")
global lenbest ##########
lenbest = step ##########
global best ##########
best = board ##########
print("in the def",best) ########## This one differs from...
attempt(best,posToGo,2) ##########
print("at the end",best) ########## ... this one. ??!!
输入(例如):
8 8
1 2
我得到了这个输出:
new best with pathlength 64 after 0.0017115690152521709 secconds
in the def [[1, 16, 63, 34, 3, 18, 21, 36], [64, 33, 2, 17, 52, 35, 4, 19], [15, 62, 49, 58, 45, 20, 37, 22], [32, 59, 44, 53, 48, 51, 42, 5], [61, 14, 57, 50, 43, 46, 23, 38], [28, 31, 60, 47, 54, 41, 6, 9], [13, 56, 29, 26, 11, 8, 39, 24], [30, 27, 12, 55, 40, 25, 10, 7]]
at the end [[1, 4, 3, 4, 3, 4, 5, 20], [4, 5, 2, 3, 4, 5, 4, 5], [3, 2, 13, 4, 3, 4, 7, 6], [14, 3, 4, 3, 10, 5, 4, 5], [3, 4, 3, 4, 5, 4, 5, 6], [4, 13, 4, 7, 4, 11, 6, 7], [13, 10, 13, 8, 7, 8, 7, 8], [14, 13, 8, 9, 10, 7, 8, 7]]
所以它有所不同,虽然它只改变了一次(计算出最好的线条......'):'(
答案 0 :(得分:0)
当在函数内部定义变量时(就像在函数attempt
中使用best = board
一样),此变量自动变为本地变量。这意味着在您的示例中,全局变量的值虽然看起来与函数有关,但未被更改。
为了能够写入全局变量,添加语句
global best
在函数的开头。
另请注意,通过将board
分配给best
,您仍然只有一个数组 - 它现在由两个变量引用。使用模块deepcopy
中的函数copy
,
from copy import deepcopy
你可以写:
best = deepcopy(board)
现在,输出显示:
('new best with pathlength', 64, 'after', 0.040691, 'secconds')
('in the def', [[1, 16, 63, 34, 3, 18, 21, 36], [64, 33, 2, 17, 52, 35, 4, 19], [15, 62, 49, 58, 45, 20, 37, 22], [32, 59, 44, 53, 48, 51, 42, 5], [61, 14, 57, 50, 43, 46, 23, 38], [28, 31, 60, 47, 54, 41, 6, 9], [13, 56, 29, 26, 11, 8, 39, 24], [30, 27, 12, 55, 40, 25, 10, 7]])
('at the end', [[1, 16, 63, 34, 3, 18, 21, 36], [64, 33, 2, 17, 52, 35, 4, 19], [15, 62, 49, 58, 45, 20, 37, 22], [32, 59, 44, 53, 48, 51, 42, 5], [61, 14, 57, 50, 43, 46, 23, 38], [28, 31, 60, 47, 54, 41, 6, 9], [13, 56, 29, 26, 11, 8, 39, 24], [30, 27, 12, 55, 40, 25, 10, 7]])
即,best
中存储的电路板副本尚未更改。