Передаются ли логические значения Python по значению?

StackOverflow https://stackoverflow.com/questions/1494696

  •  18-09-2019
  •  | 
  •  

Вопрос

Я отправил ссылку на объект bool и изменил ее внутри метода.После завершения выполнения метода значение bool вне метода не изменилось.

Это наводит меня на мысль, что логические значения Python передаются по значению.Это правда?Какие еще типы Python ведут себя подобным образом?

Это было полезно?

Решение

Переменные Python не являются «ссылками» в смысле C++.Скорее, это просто локальные имена, привязанные к объекту в каком-то произвольном месте в памяти.Если этот объект сам по себе является изменяемым, изменения в нем будут видны в других областях, которые связали имя с объектом.Многие примитивные типы (в том числе bool, int, str, и tuple) являются неизменный однако.Вы не можете изменить их значение на месте;скорее, вы присваиваете новое значение тому же имени в локальной области.

Фактически, почти каждый раз* вы видите код вида foo = X, это означает, что имя foo присваивается новое значение (X) в вашем текущем локальном пространстве имен, а не в месте в памяти, указанном foo обновляется его внутренний указатель, чтобы вместо этого он ссылался на местоположение X.

*- единственным исключением в Python являются методы установки свойств, которые позволяют вам писать obj.foo = X и переписать его в фоновом режиме, чтобы вместо этого вызывать метод типа obj.setFoo(X).

Другие советы

Это зависит от того, является ли объект изменяемым или неизменяемым.Неизменяемые объекты ведут себя так же, как вы видели при использовании bool, тогда как изменяемые объекты будут меняться.

Для справки: http://www.testingreflections.com/node/view/5126

Python передает ссылки на объекты по значению (как в Java), и все в Python является объектом.Это звучит просто, но затем вы заметите, что некоторые типы данных демонстрируют характеристики передачи по значению, в то время как другие действуют как передача по ссылке...в чем дело?

Важно понимать изменяемые и неизменяемые объекты.Некоторые объекты, например строки, кортежи и числа, являются неизменяемыми.Изменение их внутри функции/метода приведет к созданию нового экземпляра, а исходный экземпляр вне функции/метода не изменится.Другие объекты, такие как списки и словари, являются изменяемыми, что означает, что вы можете изменить объект на месте.Следовательно, изменение объекта внутри функции/метода также изменит исходный объект снаружи.

Следует помнить, что существует нет способ в Python для функции или метода перепривязки имени в вызывающем пространстве имен.Когда вы пишете: «Я отправил ссылку на объект bool и изменил ее внутри метода», на самом деле вы (я предполагаю) перепривязали имя параметра (к которому значение bool было привязано вызовом) внутри тело метода.

Суммируя, в Python нет переменных;есть объекты (как и True и False, логические значения неизменяемы) и имена.Имена — это то, что вы называете переменными, но имена принадлежат определенной области, и обычно вы не можете изменять имена, кроме локальных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top