0

I made this python program using Python 3.4.2. At the begin I defined a variable 'best', later it can be changed in a function (i didn't forget 'global best'). Every time it's changed it's printing ('new best',best) At the end of the program its again printing best's value, but it's different from the last time it has changed... How is this possible???

Most of the code isn't important for this (i guess), but the lines having anything to do with best are marked with ##########

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. ??!!

With input (for example):

8 8
1 2

I get this output:

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]]

So it's different, while it's only changed once (count the lines saying 'new best....') :'(

Wilcooo
  • 3
  • 3

1 Answers1

0

When a variable is defined inside a function (as you do in the function attempt with best = board), this variable automatically becomes a local one. This means that in your example, the value of the global variable isn't changed though looks so to the function.

To be able to write to the global variable, add the statement

global best

at the beginning of the function.

Also be aware that by assigning board to best, you still only have one array—it's now referenced by two variables. Using the function deepcopy from the module copy,

from copy import deepcopy

you can write:

best = deepcopy(board)

Now, the output reads:

('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]])

I.e., the copy of the board stored in best hasn't been changed.

user3426575
  • 1,723
  • 12
  • 18
  • I tried global, and nonlocal, but it's still not working... Not at the beginning of the function nor one line above changing best – Wilcooo Nov 24 '14 at 20:13