2015-03-06 2 views
0

Я не новичок в python. Но недавно я столкнулся с ошибкой из-за какого-то заблуждения. Кто-то, пожалуйста, помогите мне прояснить это. Вся программа здесь: http://www.codeskulptor.org/#user39_cFs3Z8mAtf_0.pyФункция программирования функции программирования Python

Я имею функцию

def mc_trial(board, player): 
""" 
Plays a game starting with the given player by making random 
moves and alternating between players. 
""" 
    while board.check_win() == None: 
    # Get a random empty square 
     empty_squares = random.choice(board.get_empty_squares()) 

    # Move the player in a random position 
     board.move(empty_squares[0], empty_squares[1], player) 

    # Switch the player 
     player = provided.switch_player(player) 

# Game has ended 
return 

scores = [[0 for dummy in range(board.get_dim())] \ 
    for dummy in range(board.get_dim())] 
board_clone = board.clone() 
for dummy in range(trials): 
    print board_clone ## Empty board 
    mc_trial(board_clone, player) 
    print board_clone #### Here value is changing after function call. How ?? 

мои сомнения "board_clone" переходит к функции mc_trial(). оператор return не предоставляет ничего, относящегося к возврату значения, кроме None. Но после вызова, когда я печатаю «board_clone», значение меняется. Я попытался прояснить это с помощью ipython через образец программы. Но ценность остается неизменной, как в локальной области. Для пояснения я запустил образец программы, там он ведет себя так, как я ожидал.

def func1(var): 
    x = 0 
    while x < 1: 
     var[1:5] 
     x = x+1 
    return 

var1 = [1,2,3,4,5,6,7,8,9] 
print "B F", var1 
func1(var1) 
print "A F", var1 
+0

Исправьте отступ в вашей программе. – thefourtheye

+0

@ thefourtheye - Заявление исправлено. – user3116355

+0

Как насчет 'возвращения'? – thefourtheye

ответ

2

Это нормальное поведение Python. Списки передаются по ссылке, так что если вы изменить элементы в списке в функции изменения будут сохраняться:

def f(mylist): 
    mylist[0] = 1 

>>> l = [0, 0, 0] 
>>> mylist(l) 
>>> l 
[1, 0, 0] 

Причина ваш второй пример не изменяя список потому, что var[1:5] заявление не Делать что-нибудь. Он просто создает временную переменную, которая представляет собой фрагмент списка var, а затем отбрасывает его. Это просто как a + 1; это создало бы временную переменную, но не изменило бы a даже внутри функция, не говоря уже о ней.

+0

Фактически вторым примером была проверка образца. Я знаю, что ты сказал. Но почему изменения в «board_clone» сохраняются даже после функции. Даже если мы передаем список функции, изменения, внесенные в это, будут доступны для вызывающей функции ???? Я не знаю об этом. – user3116355

+1

Да, это именно то, что происходит. –

+0

новый информация. Благодарю. Я проверю это. – user3116355

1

Я бы предположил, что ваша проблема заключается в том, что ваш «клон» имеет ссылки на datastructs в объекте платы. Код клона не отображается в ссылке, которую вы разместили? .. и насколько я помню, это не встроенная вещь python (возможно, я ошибаюсь).

Читать эту How to clone or copy a list?

и/или это

https://docs.python.org/2/library/copy.html

+0

да. «board_clone» предоставляется кодексами как часть проблемы. Но почему изменения в значении сохраняются в другой функции. они проходят board_clone, и в этом они модифицировали его с помощью платы. (Нормальная ссылка на аргумент). Но почему эти изменения сохраняются в старой переменной board_clone. Объем не изменяется, если только он не является глобальной переменной. – user3116355

+0

трудно быть уверенным, если мы не знаем, что делает board.clone(), а также то, как выглядит класс платы. Мы с Эндрю Маги и я говорим в основном то же самое здесь. Если вы не будете осторожны в том, как вы клонируете объект, вы просто получите другой указатель на существующую структуру данных. В этот момент board_clone является в основном просто псевдонимом для платы, поэтому любые изменения в board_clone влияют на плату, потому что они представляют собой два разных имени для одного и того же объекта. –

+1

(они на самом деле являются именами, которые используются для поиска объектов в пространствах имен имен, например, см. Этот http://stackoverflow.com/questions/61517/python-dictionary-from-an-objects-fields) или встроенных локалей и глобальные методы. –

Смежные вопросы