Mam następujący kod:

class Hello(object):
    def __init__(self, names):
        self.names = names
    def getnames(self):
        return self.names  

if __name__ == "__main__":
    names = ['first', 'middle', 'last']     
    ob = Hello(names)
    a = ob.getnames()
    print a
    a.remove('first')
    print a
    print ob.getnames()

Poniżej znajduje się wyjście:

['first', 'middle', 'last']
['middle', 'last']
['middle', 'last']

Czy to dlatego, że getNames jest uznawany? A może być tutaj coś innego. Czy ktoś może wyjaśnić? Jak zrobić metodę zwrócić oryginalną listę?

3
user955632 8 październik 2011, 04:05

3 odpowiedzi

Najlepsza odpowiedź

W Pythonie przypisanie nigdy nie tworzy kopii struktury danych. Wytwarza tylko nazwę odnosić się do wartości. Ponadto inwokacja funkcji zasadniczo przypisuje rzeczywiste argumenty do nazw argumentów. Więc nic nie jest kopiowane w swoim kodzie. Nazwy a i ob.names odnoszą się do tej samej listy. Jeśli chcesz mieć dwie kopie listy (oryginał i jeden do modyfikacji), musisz dokonać kopii w pewnym momencie. Musisz zdecydować, gdzie to ma największy sens.

Możesz skopiować listę kilka różnych sposobów: list(L) lub L[:] są najczęściej sposobami.

3
Ned Batchelder 8 październik 2011, 00:20

Mieć getnames zwróć kopię:

def getnames(self):
    return self.names[:]
3
Dan D. 8 październik 2011, 00:09

Nazwa a odnosi się do tej samej tablicy, która jest przechowywana w ob.names. Jeśli zmienisz a, zmienisz ob.names, ponieważ obaj odnoszą się do tego samego.

0
Caleb 8 październik 2011, 00:12