В питоне все идет по ссылке
В Python все является ссылкой, и ссылки передаются по значению.
Если вы хотите использовать эти термины. Но эти термины усложняют понимание.
Намного проще: в Python переменная - это имя объекта. =
используется для изменения объекта, к которому относится имя. Левая часть может относиться к части существующего объекта, и в этом случае весь объект изменяется путем замены этой части. Это потому, что объект, в свою очередь, на самом деле не содержит своих частей, а вместо этого содержит больше имен, которые могут стать причиной ссылки на разные вещи.
тогда когда создается новый объект?
Объекты создаются при их создании (с помощью конструктора классов или в случае встроенных типов, имеющих литеральное представление, путем ввода литерала). Я не понимаю, как это относится к остальной части вашего вопроса.
m = m[1:] # m changes its reference to the new sliced list
Да, конечно. Теперь m
относится к результату оценки m[1:]
.
edits m but not d (I wanted to change d)
Да, конечно. Почему изменится , изменится d
? Это была не какая-то магия, это был просто результат оценки d['m']
. Точно то же самое происходит в обеих строках.
Давайте рассмотрим более простой пример.
m = 1
m = 2
Это приводит к тому, что 1
становится 2
? Нет, конечно нет. Целые числа неизменны. Но происходит то же самое: m
заставляют назвать одну вещь, а затем назвать другую вещь.
Или иначе: если бы «ссылки» работали так, как вы ожидаете, то строка m = m[1:]
была бы рекурсивной. Вы ожидаете, что это будет означать «где бы вы ни увидели m
, относитесь к нему так, как если бы оно означало m[1:]
». Ну, в этом случае m[1:]
будет означать m[1:][1:]
, что будет означать m[1:][1:][1:]
и т. Д.