2013-10-27 3 views
0

Мой код выглядит следующим образом (я не знаю, почему это не отступом):Почему мой код не изменяет список?

def move_joker_2(deck): 

#start checking every card in the deck until the position of 
#JOKER2 is found 

#we start from position 0 
position = 0 

while deck [position] != JOKER2: 
    position = position + 1 

#the new position for JOKER2 
if position < len (deck) - 3: 
    new_position = position + 2 
elif position == len (deck) - 2: 
    new_position = 0 
else: 
    new_position = 1 

#to reorganize deck, we need 2 things 
# 1.) a list of the cards above JOKER2 after moving the cards 
# 2.) a list of the cards below JOKER2 after moving the cards 

#depending of new_position, there are 3 possible new decks 

if new_position == 0: 
    #no cards above, JOKER2 will become the top card 
    cards_above = [] 
    #every other card will be below it 
    cards_below = deck 
    #remove JOKER2, since we moved it 
    cards_below.pop(position) 

elif new_position == 1: 
    #the only card above JOKER2 will be the top card 
    cards_above = [deck[0]]  

    #every other card up except the last one will be below it 
    cards_below = deck [new_position:len(deck)-1] 

else: 

    cards_above = deck[0:new_position+1]  
    #remove JOKER2, since we moved it 
    cards_above.pop(position) 
    cards_below = deck [new_position+1:] 

#final deck 
deck = cards_above + [JOKER2] + cards_below 

Мой код получает список строк и мутирует его в конце концов ...

Но почему он не меняет исходный список? Например:

палубе = [1, 3, 27, 8, 9] move_joker_2 (дека)

Он должен изменить список, если учесть, что JOKER2 27, чтобы: [1, 3 , 8, 9, 27]

Но всякий раз, когда я называю палубу она не изменилась ...

+0

Боковой комментарий о коде: вы уверены, что вам действительно нужно три различных случая? – 6502

ответ

6

deck = cards_above + [JOKER2] + cards_below не меняет содержание deck.

Это новый список и deck ссылка, что новый список.

Чтобы изменить содержание стола, используйте фрагмент, обозначенный как deck[:] = cards_above + [JOKER2] + cards_below.

>>> def f1(deck): 
...  deck = [1,2,3] # This does not change the `deck` passed. 
         # This just create a local variable `deck`. 
... 
>>> def f2(deck): 
...  deck[:] = [4,5,6] # This change the `deck` passed. 
... 
>>> deck = [0] 
>>> f1(deck) 
>>> deck 
[0] 
>>> f2(deck) 
>>> deck 
[4, 5, 6] 
1

deck передается в качестве аргумента только переменный с копию справки поэтому при назначении

deck = .... 

вы создаете новый объект и присвоить его ссылку на переменную палубу. Это не ссылки в смысле C++, это всегда копии ссылок.

Один opssible Walkaround будет использовать

deck[:] = ... 

, который обновляет содержимое объекта, а не только эталонное значение

+0

Отлично, я не знал о существовании этой разделенной формы. Однако я заметил, почему мой список не мутировал, и он использовал цикл while для замены каждого символа в отдельности, но это выглядит лучше. – OHHH

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