2015-01-03 2 views
0
def func(x): 
    print "inside function" ,id(x) 
    x = 2 
x = 50 
print "outside function" ,id(x) 
print 'Value of x before function call is', x 
func(x) 
print 'Value of x after function call is', x 

выход:питон целое значение аргумента не меняется, даже если идентификатор() работает так же, вызывающей и вызываемой функции

outside function 6486996 
Value of x before function call is 50 
inside function 6486996 
Value of x after function call is 50 

Предполагая, что id() дает место в памяти объекта. Несмотря на то, что оба сохраняются в одном и том же месте, если значение x изменяется в func(), оно не выполняется снаружи.

ответ

3

А, но вызов id(x) в функции ссылается на глобальный x, который был передан функции, но x = 2 создает новый локальный x. Попробуйте это:

def func(x): 
    print "inside function", id(x) 
    x = 2 
    print "still inside function", id(x) 

x = 50 
print "outside function" , id(x) 
print 'Value of x before function call is', x 
func(x) 
print 'Value of x after function call is', x 

типичный выход

outside function 168950596 
Value of x before function call is 50 
inside function 168950596 
still inside function 168951172 
Value of x after function call is 50 
+0

Спасибо @ user590028! Я понятия не имею, как это произошло ... –

0

если и хотят знать больше об этом, я думаю, и нужно полностью понять основные питона.

пункт о вашем вопросе:

изменяемый объект в качестве параметра

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

неизменяемым объект в качестве параметра

До сих пор не может повторно связать внешнюю ссылку, и даже не может мутировать этот объект.

Обновление для комментариев: так что u передайте x (Целый неизменный) для вызова функции, вы не можете мутировать этот объект. и вы повторно привязываете х-ссылку в функции, внешняя область ничего не знает, после выполнения внешняя ссылка все равно указывает на исходное целое число 50.

+0

Поскольку пересвязывание - это то, что здесь происходит, не нужно различать изменчивое и неизменяемое в этом контексте. – glglgl

+0

Кроме того, целые числа неизменны в Python, поэтому они могут быть интернированы. –

0

Назначение обычно изменяет привязку между именем и объектом (если вы этого не сделаете, например x = x). Он не делает никаких изменений на объекте (которые не будут работать на int с так или иначе, поскольку они неизменны, но так же, как примечание стороны)

Таким образом, в этом случае ваш x внутри функциональных точек на 50 объекта пока вы не измените его. Затем он указывает на другой объект. Сам объект не затрагивается.

Для того, чтобы указать на то, что происходит шаг за шагом:

  • вне x указывает на INT объект со значением 50 вызов функции
  • : внутри x указывает на тот же объект
  • внутри x изменяется, чтобы указать на другой объект, имеющий значение 2
  • возвращение: снаружи x по-прежнему указывает на 50.
Смежные вопросы