2016-06-03 4 views
2

все, недавно я прочитал несколько статей о [передаче значения в Python].Могу ли я понять [Передача значения в Python] таким образом?

вот ссылка: How do I pass a variable by reference?

Однако я запутанным, если я могу понять, это так?

enter image description here

Как вы видите:

  1. Вне метода(): the_link рефов к происхождения список OBJ

  2. Внутри метод():

    • скопировать те же новые рефов the_link (_copy) в список происхождения OBJ
    • если есть change_refs заявление.
    • затем Python создает новый список obj внутри метода.
    • наконец, пусть the_list (_copy) рефов в этом новый список OBJ.
  3. назад Снаружи: the_link еще рефов в список происхождения OBJ

, если я считаю, что этот путь. Результат OUTPUT также такой же.

Но я не уверен, что это OK или NOT?

Извините, если я не выражаю это правильно. Надеюсь, вы, ребята, понимаете = =

+0

Создайте практический пример в коде и напечатайте идентификатор ('print (id (the_list))) каждый шаг по пути, чтобы увидеть, что происходит. – Evert

+0

Продвиньте содержимое своего списка;) Попробуйте 'the_list.append (['you', 'other', 'brothers', 'can \' t ',' deny '])'; это должно решить вашу проблему. – Will

+0

Есть ли пример кода, который поставляется с этой диаграммой/шагами? Это действительно поможет прояснить то, что вы не понимаете. –

ответ

2

Вы получили это правильно. В Python параметры передаются с помощью ссылочного значения , что означает, что копия или значение ссылки (или указатель, если вы исходите из фона C) передаются методу. Подумайте об этих ссылках/указателях в виде целых чисел, содержащих индексы для местоположений в памяти.

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

Но, так как мы имеем два различных ссылок (целые числа), что указывает на тот же объект в памяти (original = XYZ location in memory и copy = XYZ location in memory), когда интеграл или значение местоположения само по copy изменяется (то есть другой объект присвоено copy), изменение не отражается в original, потому что copy и original являются двумя отдельными ссылками/указателями.

Если, однако, copy был указатель на указатель объекта (ObjectType** copy в C), то изменение было бы отражено в original указателя/ссылки тоже.

Если мы имеем следующую программу,

def mutate_list(copy): 
    copy = [5, 6, 7, 8] 
    print(original, copy) 

original = [1, 2, 3, 4] 
mutate_list(original) 

Выход будет [1, 2, 3, 4] [5, 6, 7, 8]

Если мы изменим метод mutate_list на следующее:

def mutate_list(copy): 
    copy.clear() 
    copy.append([5, 6, 7, 8]) 
    print(original, copy) 

Выход будет [5, 6, 7, 8] [5, 6, 7, 8].

-1

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

Попробуйте посетить http://pythontutor.com/, чтобы помочь вам визуализировать происходящее.

Смежные вопросы