Какие из них неизменны в Python? - PullRequest
2 голосов
/ 14 апреля 2011

Я пытаюсь выяснить, являются ли следующие элементы неизменяемыми в Sage (который построен на Python, поэтому я считаю, что если он неизменен в Python, я считаю, что в большинстве случаев он будет неизменным в Sage)

Ниже приведены объекты e, f, g, i

class e: pass
f = e()
g = pi # (g's "type" in Sage is symbolic expression. It's supposed to be 3.1415....etc)
i = lambda x: x*x

. Я понимаю, что e - это класс, который означает, что он изменчив (имеет ли смысл неизменный класс? Разве все классы не могут быть изменены?).Поскольку f является экземпляром класса, я предполагаю, что он также является изменяемым, поскольку классы являются изменяемыми.

Поскольку числа являются неизменяемыми в Python, g также должна быть неизменной, поскольку это число, несмотря на то, что оно иррационально

Наконец, я функция, которая означает, что она должна быть изменяемой?

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

Ответы [ 2 ]

7 голосов
/ 14 апреля 2011

e является изменяемым. Например, вы можете добавить новый метод в класс: e.foo = lambda self,x: x.

f является изменяемым. Например, вы можете добавить новое поле к этому экземпляру класса: f.x = 99.

g является неизменным. Вы ничего не можете изменить в этом.

i не является неизменным. Вы можете делать с ним все виды зла: i.func_code = (lambda x: 123).func_code, после чего i(10) будет 123 вместо 100. (Вы также можете делать с ним более разумные вещи. После i.__doc__ = "This function returns the square of its argument." вы получите более полезный результат от help(i).)

Объект является изменчивым, если вы можете что-то сделать с объектом, который изменит его возможное будущее поведение. Вы не можете изменить поведение 10; Вы можете изменить поведение функционального объекта, или класса, или экземпляра класса, или списка. (Но не кортеж. После создания кортежа он остается таким же, каким он есть, пока он существует.)

2 голосов
/ 14 апреля 2011

Формально?Объект является изменяемым, если он может изменять значение без изменения identity .

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

>>> x = orig_x = []
>>> x == []
True
>>> x += [1]
>>> x == []      # The value of x has changed
False
>>> x is orig_x  # But the identity remains the same
True

Однако числа неизменны, поэтому их значение не может измениться.Вместо этого переменная должна быть обновлена, чтобы ссылаться на совершенно другой объект:

>>> x = orig_x = 1
>>> x == 1
True
>>> x += 1
>>> x == 1        # Again, the value of x has changed
False
>>> x is orig_x   # But now the identity has changed as well
False

Неизменяемость является важной концепцией, поскольку знание того, что значение объекта не может измениться, позволяет сделать определенные предположения об этом (дляНапример, для dict фактически требуются неизменяемые ключи, а для set и frozenset требуются неизменяемые члены, поскольку значение объекта влияет на способ его хранения в структуре данных. Если изменяемые записи были разрешены, они могут оказаться внеправильное место, если они были изменены после хранения)

Вопреки распространенному мнению, пользовательские классы, которые не переопределяют определение равенства, являются технически неизменными.Это потому, что по умолчанию определение «значения» пользовательского класса просто id(self).Когда значение объекта равно его идентичности, очевидно, что они не могут различаться с течением времени, и, следовательно, объект не считается «изменчивым».

Неформально?Большинство людей используют интуитивно понятное «Могу ли я изменить это?»определение в соответствии с ответом Гарета МакКогана.Это та же основная идея, что и формальное определение, просто использование более широкого значения термина «ценность», чем техническое определение в терминах проверок на равенство.

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