Что за хрень эти указатели? оп разработчиков Хватит писать на псевдокоде О ЯЬУ7 Пособие «1 шст / it-юмор :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)
Подробнее
Что за хрень эти указатели?
оп
разработчиков
Хватит писать на псевдокоде
О ЯЬУ7
Пособие «1 шстоя щего » раз работ ч и ка
it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор
А, не немного по другому. В первом случае мы присваиваем тому же идентификатору новый объект, а во втором мы редактируем объект на месте. Это работает со всеми мутабильными объёктами.
Так что любой язык надо знать хочь чуть-чуть поглубже, чем a=b, а в Плюсах таких тонкостей в мильён раз больше.
А вот кстати да, я был неправ. Действительно во втором случае мы редактируем объект на месте. Однако переменная "а" при этом не должна была измениться, видимо вот тут особенность numpy и зарыта - переменная становится типа обратнозависима или как-то так (я откровенно плох в программировании)
Да нет же. В обоих случаях сначала и имени a, и имени b присваивается один и тот же объект в памяти, но потом, в первом случает перед операцией сложения в памяти создаётся новый объект и уже потом снова присваивается имени b, а во втором случае происходит модификация объекта в памяти на прямую.
Опять же, это свойство мутабельных объектов, а немутабельные в обоих случаях ведут себя одинаково ожидаемо.
Например list — мутабельный, как и array в numpy:
>>> a = [1]
>>> b = a
>>> b = b + [1]
>>> print(a, b)
[1] [1, 1]
>>> a = [1]
>>> b = a
>>> b += [1]
>>> print(a, b)
[1, 1] [1, 1]
а tuple — немутабельный:
>>> a = (1,)
>>> b = a
>>> b = b + (1,)
>>> print(a, b)
(1,) (1, 1)
>>> a = (1,)
>>> b = a
>>> b += (1,)
>>> print(a, b)
(1,) (1, 1)
В Питоне нет переменных как таковых, в питоне все идентификаторы — это ссылки на объект в памяти.
Вот не знал этого. Я питон знаю на уровне "написать алгоритм расчета чтобы не пересчитывать вручную по десять раз". Когда формул очень много, питон удобнее excel, а для многократных расчетов он удобнее чем маткад.
чуть добавлю
пусть вас, конструкция b = b + 1 не вводит в заблуждение
в следующей строке "а" инициализируется заново
а суть всего лишь в немного не типично перегрузке оператора "+"
в ходе как было сказано выше объект класса арей ведёт себя как иммютбл тоесть как строка при любой сибуации изменения возвращает новый объект
и ровно противоположное при простом аналоге инкремента, то есть перегружено так что оператор имеет возможность изменить объект.
И как всем понячятно когда а и b во втором случае сравниваются то по факту єто один и тот же объект и b по факту ссілается на "а".
даже при таком раскладе питон посасывает, ведь есть высокоуровневые языки программирования типа Kotlin, TypeScript с (строгой) типизацией, писать на них ещё проще (автокомлишн работает адекватнее, и вообще он есть) и отсекаются совсем тупые ошибки, пользователям стороннего кода достаточно глянуть на интерфейсы, а не шараебиться по сорцам и корявой доке
Не обобщай... К примеру у нас люди, которые пишут на Python в продакшн, выбирают для оптимизации некоторых мест C++, так как не хотят вляпываться в низкоуровневость C.
Ну ты ещё скажи, что указатели в C89 не низкоуровневые, включая арифметику указателей. И вообще система типов, начиная прямо с определения типов int и char. C89 это высокоуровневый ассемблер.
In [10]: a = np.array(2)
то a станет равна 4?
Так что любой язык надо знать хочь чуть-чуть поглубже, чем a=b, а в Плюсах таких тонкостей в мильён раз больше.
Опять же, это свойство мутабельных объектов, а немутабельные в обоих случаях ведут себя одинаково ожидаемо.
Например list — мутабельный, как и array в numpy:
>>> a = [1]
>>> b = a
>>> b = b + [1]
>>> print(a, b)
[1] [1, 1]
>>> a = [1]
>>> b = a
>>> b += [1]
>>> print(a, b)
[1, 1] [1, 1]
а tuple — немутабельный:
>>> a = (1,)
>>> b = a
>>> b = b + (1,)
>>> print(a, b)
(1,) (1, 1)
>>> a = (1,)
>>> b = a
>>> b += (1,)
>>> print(a, b)
(1,) (1, 1)
В Питоне нет переменных как таковых, в питоне все идентификаторы — это ссылки на объект в памяти.
пусть вас, конструкция b = b + 1 не вводит в заблуждение
в следующей строке "а" инициализируется заново
а суть всего лишь в немного не типично перегрузке оператора "+"
в ходе как было сказано выше объект класса арей ведёт себя как иммютбл тоесть как строка при любой сибуации изменения возвращает новый объект
и ровно противоположное при простом аналоге инкремента, то есть перегружено так что оператор имеет возможность изменить объект.
И как всем понячятно когда а и b во втором случае сравниваются то по факту єто один и тот же объект и b по факту ссілается на "а".
беда в том, что у нампая (а = а+б) не тождественно (а += б), хотя по логике должно было бы.
Сейчас решает скорость разработки, удобство использования, простота обучения и лёгкость чтения кода.
Но нет же, тогда же нельзя будет гордиться, как ты героически жрёшь кактус.