Переменная экземпляра не обновляется - PullRequest
1 голос
/ 01 апреля 2020

Я не могу понять, почему переменная в классе не обновляется.

class Pile:
    def __init__(self, cards):
        self.cards = cards

    def __str__(self):
        result = ' '.join(self.cards)
        return result

    def __repr__(self):
        return f'Pile({self.cards})'

    def flip(self):
        self.cards.reverse()
        return eval(f'Pile({self.cards})')

Это часть моего кода. И когда я запускаю этот код ниже,

cards = Pile(['AH', '3S', 'KC'])
print(cards)
# AH 3S KC
cards
# Pile(['AH', '3S', 'KC'])
cards.flip().flip()
# Pile(['AH', '3S', 'KC'])
print(cards)

Я ожидал 'AH 3S K C', но я получил 'K C 3S AH'. «K C 3S AH» является результатом cards.flip () .

Я думаю cards.flip (). Flip () эта часть не не работает, потому что когда я написал cards.flip () и снова cards.flip () , это работает именно так, как я хотел. Я не знаю, в чем проблема этого. Не могли бы вы объяснить по этому поводу? Спасибо за чтение.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Избавьтесь от функции eval в вашем методе flip(). Обратитесь к экземпляру Pile в методе flip и затем верните его.

Код


class Pile:
    def __init__(self, cards):
        self.cards = cards

    def __str__(self):
        result = ' '.join(self.cards)
        return result

    def __repr__(self):
        return f'Pile({self.cards})'

    def flip(self):
        self.cards.reverse()
        return self

cards = Pile(['AH', '3S', 'KC'])
print(cards)
# AH 3S KC
cards
# Pile(['AH', '3S', 'KC'])
cards.flip().flip()

# Pile(['AH', '3S', 'KC'])
print(cards)

Выход

enter image description here

1 голос
/ 01 апреля 2020

Вы не переворачиваете один и тот же объект дважды, но возвращаете независимые копии вашего первого объекта:

У вас есть экземпляр Pile с именем cards. Вы звоните flip() на это. Он переворачивает внутреннюю карту cards и возвращает eval(f'Pile({self.cards})').

eval создает NEW объект с вашими текущими self.cards в качестве начальных параметров - чтобы вы затем перевернули его (все еще другой объект, который создает еще один объект на eval ) и затем вы выбрасываете все созданные объекты, потому что вы никогда не храните их нигде.

Затем вы печатаете (один раз перевернутый) экземпляр cards.

cards = Pile(['AH', '3S', 'KC'])

print(cards, id(cards))

cards2 = cards.flip() # you flip this another time w/o storing it anywhere

print(cards2, id(cards2))  # print with obj id to see its different
print(cards, id(cards))    # print with obj id to see its different

Выход:

AH 3S KC 140645422863584 # cards
KC 3S AH 140645422863976 # result of cards.flip() as new object 
KC 3S AH 140645422863584 # your original cards once flipped

Требуется:

def flip(self):
    self.cards.reverse()
    return self  # return yourself for chaining

Читайте о eval в do c.

1 голос
/ 01 апреля 2020

Ваш метод flip должен работать с экземпляром Pile . Следовательно, flip должен возвращать экземпляр.

class Pile:
    def __init__(self, cards):
        self.cards = cards

    def __str__(self):
        result = ' '.join(self.cards)
        return result

    def __repr__(self):
        return f'Pile({self.cards})'

    def flip(self):
        self.cards.reverse()
        return self

Когда я запускаю код примера, я получаю первоначальный список, чего я и ожидал от двойного отражения:

cards = Pile(['AH', '3S', 'KC'])
print(cards)
# AH 3S KC
cards
# Pile(['AH', '3S', 'KC'])
cards.flip().flip()
# Pile(['AH', '3S', 'KC'])
print(cards)

вывод:

AH 3S KC
AH 3S KC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...