Передача параметров Python и Java

Я видел в нескольких местах, в том числе в документации Python, что Python использует семантику передачи по «присваиванию». Исходя из фона Java, где распространенная ошибка, когда говорится, что «Java передает примитивы по значению, а объекты по ссылке», является результатом того, что ссылки на объекты передаются по значению, я не могу не задаться вопросом, действительно ли Python делает то же самое. вещь.

Мне кажется, что концепции передачи ссылок на объекты по значению и передачи по присваиванию идентичны. Является ли использование Python термина «передача по назначению» попыткой смягчить проблему наличия ошибочных операторов, подобных тому, что я описал выше? Если да, то можно ли сказать, что передача параметров работает одинаково на двух языках?

Изменить: я не думаю, что этот вопрос дублируется. Здесь я спрашиваю о терминологии, используемой Python, с прямым указанием на то, как работает Java. Другой вопрос, является ли язык передачей по значению или по ссылке. Я знаю, что здесь используется номенклатура «передача по назначению», но мое утверждение, которое, кажется, подтверждается принятым ответом, заключается в том, что это действительно не отличается от того, как работает Java; это просто другое имя.


person orrymr    schedule 21.04.2015    source источник
comment
Да, справедливо сказать. Но учтите, в Python все является объектом, примитивов нет. Но вы правы в том, что все передается по стоимости. Передача по ссылке - это концепция, встречающаяся в языках, основанных на указателях, таких как C / C ++. @Luiggi ОП сказал, что это было распространенной ошибкой.   -  person Shashank    schedule 21.04.2015
comment
@LuiggiMendoza 'где распространенная ошибка, заключающаяся в том, что Java передает примитивы по значению, а объекты по ссылке'   -  person Anderson Vieira    schedule 21.04.2015


Ответы (1)


Да, в этом отношении Python кажется эквивалентным Java. Из http://learnpython.pbworks.com/w/page/15956522/Assignment:

Но вы должны быть осторожны с тем, что подразумевается под «изменениями параметров». Присвоение нового значения имени параметра (внутри функции параметр - это просто локальная переменная) не изменяет исходный объект - он только повторно связывает локальную переменную с новым объектом.

Итак, Python передает «объектные ссылки» «по значению».

person GriffeyDog    schedule 21.04.2015
comment
Просто для пояснения: Python фактически передает параметры, ссылаясь на него. Присвоение имени формального аргумента перезапишет предыдущую ссылку. Попробуйте l.append("Hello") внутри функции f(l). Исходный объект будет изменен. В этом аспекте Python больше похож на ссылки C ++. - person too honest for this site; 21.04.2015
comment
@Olaf Это именно то, что я хочу сказать, и Java ведет себя точно так же. Объект ссылки может быть изменен, но переназначение ссылки в функции / методе не влияет на ссылку вызывающего. - person GriffeyDog; 21.04.2015
comment
Да, я просто хотел прояснить это, потому что сначала я прочитал ваш ответ иначе, пока я немного не разобрался с цитатами. Просто не был уверен, правильно ли я истолковал ваш ответ. - person too honest for this site; 21.04.2015
comment
@Olaf: В этом аспекте Python больше похож на ссылки C ++. Нет. Семантика передачи и назначения в Python в точности идентична семантике в Java, которая в точности идентична указателям на объекты в C ++. Ссылки на C ++ - это совсем другое. - person newacct; 22.04.2015
comment
@newacct: я не согласен, так как оба являются в основном указателями, но с другим синтаксисом и ссылками, скрывающими некоторые аспекты указателя. Однако, поскольку мне трудно объяснить, что я имею в виду на английском языке, я бы сказал, что мы должны просто согласиться с тем, что мы можем не соглашаться в этом аспекте. - person too honest for this site; 22.04.2015
comment
Верно, что ссылки Java - это просто указатели (как свидетельствует NullPointerException), но они отличаются от указателей C ++. Я не уверен в точных деталях, но это связано с назначением объектов указателям или ссылкам на объекты внутри метода. Если в C ++ переназначить внутри метода, это повлияет на внешнюю область видимости, тогда как в Java / Python этого не произойдет. - person orrymr; 22.04.2015
comment
@Olaf: Я говорю именно о синтаксисе и семантике. Это эквивалент указателей C ++. Это НЕ эквивалентно ссылкам на C ++. - person newacct; 22.04.2015
comment
@orrymr: Нет, они в точности эквивалентны указателям C ++ в том смысле, что один и тот же код с одинаковой структурой всегда будет вести себя одинаково на обоих. Все, что вы говорите о ссылках в Java / Python, также применимо к указателям в C ++ и наоборот. - person newacct; 22.04.2015
comment
@newacct: Итак, когда я вхожу: Cat myCat; Это делает myCat указателем? Только один раз я ввожу: myCat = new myCat (Горлакс Разрушитель); Это указывает указатель (или ссылку Java) myCat на новый объект Cat? - person orrymr; 23.04.2015
comment
@orrymr: Ага, именно так - person newacct; 24.04.2015