Распределение памяти Python - PullRequest
0 голосов
/ 27 ноября 2018

Мне действительно интересно, как работает распределение памяти Python.

Я написал 2 кода:

1.

list = []
a = [1,2,3]
list.append(a)
a = [3,2,1]
print(list)
print(a)

2.

def change(list):
    list[1] = 50
    list[2] = 70

list = []
a = [1,2,3]
list.append(a)
change(a)
print(list)
print(a)

Когда я компилирую первый код, я получаюрезультат [[1,2,3]] и [3,2,1].

Однако, когда я компилирую второй код, я получаю результат [1,50,70].

В первом случае я создаю объект «а» и массив «список».Когда я добавляю свой объект «a» к массиву, массив фактически указывает на него.Затем, когда я присваиваю новый массив «a» [3,2,1], объект [1,2,3] сохраняется в массиве, а «a» указывает на новый массив [3,2,1].

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

Может кто-нибудь объяснить мне, как это действительно работает?

1 Ответ

0 голосов
/ 27 ноября 2018

Каждая переменная, которую вы создаете в Python, является ссылкой на объект.Списки - это объекты, которые содержат несколько ссылок на разные объекты.

Почти все операции в python изменяют эти ссылки, а не объекты.Поэтому, когда вы делаете list[1] = 50, вы изменяете вторую ссылку, содержащуюся в элементе списка.

Я обнаружил, что полезным инструментом для визуализации этого является Python Tutor

Итак, для вашего первого примера

list = [] # you create a reference from `list` to the the new list object you have created
a = [1,2,3] # you create a reference from `a` to the new list you have created which itself contains 3 references to three objects, `1`, `2` and `3`.
list.append(a) # this adds another reference to `list` to the object referenced by `a` which is the object `[1, 2, 3]`
a = [3,2,1] # create a reference from `a` to the new list you have created which itself contains 3 references to three objects, `3`, `2` and `1`.
print(list) # print the object referenced by `list`
print(a) # print the object referenced by `a`

Для вашего второго примера

def change(list): # create a reference from `change` to a function object
    list[1] = 50 #change the second reference in the object referenced by `list` to `50`
    list[2] = 70 #change the third reference in the object referenced by `list` to `70`

list = [] # create a reference from `list` to a new list object
a = [1,2,3] # create a reference from `a` to a new list object which itself contains three references to three objects, `1`, `2` and `3`.
list.append(a) # add a reference to list to the object pointed to by `a`
change(a) # call the function referenced by change
print(list) # print the object referenced by `list`
print(a) # print the object referenced by `a`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...