Python передает объект путаницей ссылок - PullRequest
0 голосов
/ 04 декабря 2018

Привет У меня, кажется, есть проблемы с пониманием передачи объекта по ссылке в Python.Я понимаю вывод примера 1, но не должен ли пример 2 вести себя аналогичным образом и не изменять матрицу A?

Пример 1:

def reassign(list):
  list = [0, 1, 2]

list = [3]
reassign(list)
print(list)

Returns: [3]

Пример 2:

import numpy as np

A = np.ones((4,4))

def xyz(A):
    for i in range(4):
        A[i,i] = 0    
    return None

x = xyz(A)
print(A)

# Returns

[[0. 1. 1. 1.]
 [1. 0. 1. 1.]
 [1. 1. 0. 1.]
 [1. 1. 1. 0.]]

1 Ответ

0 голосов
/ 04 декабря 2018

Передача по ссылке означает, что когда вы передаете переменную в функцию, вы не передаете переменную сама , вы передаете указатель в переменную, которая является скопировано снаружи внутрь функции.В примере 1 вы передаете list в функцию, которая является указателем на список, содержащий элементы [3].Но затем, сразу после этого, вы берете эту переменную, содержащую указатель на список, и помещаете в нее новый указатель, на новый список, содержащий элементы [0, 1, 2].Обратите внимание, что вы не изменили список, с которого начинали - вы изменили то, на что ссылалась переменная, на которую ссылается .И когда вы возвращаетесь из функции, переменная, которую вы передали в функцию (все еще указатель на первый список), не изменилась - она ​​все еще указывает на список, который содержит элементы [3].

В примере 2 вы передаете A в xyz().В то время как в примере 1 вы сделали что-то вроде

A = something_else

, вы делаете

A[i] = something_else

Это совершенно другая операция - вместоизменяя то, на что указывает переменная, содержащая список, вы изменяете сам список - изменяя один из его элементов.Вместо того, чтобы A указывать на что-то другое, вы изменяете значение, на которое указывает A, путем разыменования его.

...