Если именованный кортеж неизменен, почему у него есть метод _replace? - PullRequest
0 голосов
/ 06 января 2019

Пожалуйста, примите во внимание этот код:

>>> point = namedtuple('point', ('x', 'y'))
>>> p1 = point(3,4)
point(x=3, y=4)
>>> id(p1)
2881782633456  # address in memory

>>> p1._replace(x = 78)
point(x=78, y=4)
>>> id(p1)
2881782633456  # same as before. 

Похоже, что я мутировал namedtuple на месте, то есть это изменчивый объект. Но везде говорится, что tuple s и namedtuple s являются неизменными объектами. Я сбит с толку.

Кроме того, если это неизменный объект, почему у него есть метод _replace?

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Tuple определенно неизменен. Если вы печатаете p1, то же самое даже после функции _replace.

>>> point = namedtuple('point', ('x', 'y'))
>>> p1 = point(3,4)
>>> p1
point(x=3, y=4)   #same before _replace
>>> p1._replace(x = 78)
point(x=78, y=4)
>>> p1
point(x=3, y=4)  #same after _replace

почему у вас есть _replace тогда? Он направлен на то, чтобы вернуть новый экземпляр именованного кортежа, заменив указанные поля новыми значениями. Он не изменяет сам факт кортежа. Операция недолгая.

0 голосов
/ 06 января 2019

Метод _replace создает новый именованный кортеж, он не изменяет оригинал, поэтому неизменность сохраняется.

Из документов :

Возвращает новый экземпляр именованного кортежа, заменяя указанные поля новыми значениями

0 голосов
/ 06 января 2019

Поскольку вы не присвоили его обратно, замените эту строку:

p1._replace(x = 78)

С:

pi = p1._replace(x = 78)

Чтобы оно было другим.

...