Назначение элемента массива Python - PullRequest
0 голосов
/ 23 октября 2018

Меня смущает простой случай назначения переменных массива в Python, и я надеюсь, что кто-нибудь поможет мне проверить его.

В моем понимании, если a является списком, b просто скопировал ссылку на a, и когда вы редактируете b, a также будет изменено.Между тем, вы можете использовать оператор is для проверки их идентификаторов.Например:

a = ["a", ["a", "b"]]
b = a[1]
b.append("c")

Тогда будет возвращено True, когда я использую

In [7]: b is a[1]
Out[7]: True

Однако, если a и b являются массивами,

import numpy as np
a = np.identity(3)
b = a[0, :]

Впоследствии, когда я использую is для проверки, он возвращает False, но когда я отредактировал b, a также будет изменен:

In [14]: b is a[1]
Out[14]: False
In [15]: a
Out[15]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [16]: b
Out[16]: array([0., 1., 0.])
In [17]: b *= 2
In [18]: b
Out[18]: array([0., 2., 0.])
In [19]: a
Out[19]:
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 1.]])

В принципе, я думаю, что если is вернетFalse, переменные будут иметь разные идентификаторы и ссылки, что означает, что они независимы, но сейчас это кажется неправильным, может ли кто-нибудь помочь мне проверить это?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Доступ к фрагменту массива создает представление.b и a[0,:] являются разными представлениями, даже если они просматривают одну и ту же часть массива a, поэтому значения их идентификаторов различны, даже если их базовые ссылки совпадают.

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

0 голосов
/ 23 октября 2018

Массивы Numpy работают не так, как списки Python.В вашем примере b - это numpy-представление первой строки a, которое отличается от указателя на первый элемент a.

Кстати, вы можете проверитьid каждой из ваших переменных, например, набрав id(b) или id(a[0]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...