2017-02-16 11 views
0

У меня проблемы с пониманием того, как массивы работают на python.Понимание массивов python

Я написал этот короткий демонстрационный код:

from numpy import zeros 

a = zeros((3), 'd') 
b = zeros((2,3), 'd') 
for i in range(2): 
    for j in range(3): 
     a[j] = i*j 
    b[i] = a 
print "A: " + str(a) + "\n" 
print "B: " + str(b) 

Выход этого:

A: [ 0. 1. 2.] 
B: [[ 0. 0. 0.] [ 0. 1. 2.]] 

Так вот мой вопрос. Почему это не выход для этого:

A: [ 0. 1. 2.] 
B: [[ 0. 1. 2.] [ 0. 1. 2.]] 

Потому что я сделал изменения в той же a и адрес массива не изменилась.

+0

потому, что вы изменили ссылку на все 'b' подсписков с' 'Ā' –

+0

для г в диапазоне (2)' -> ваш первый цикл имеется значение 'я = 0 ', полагая 'a [j]' = 0 для всех 'j' ->' b [0] = [0. 0. 0.] ' – asongtoruin

+0

Да, но это тот же адрес. Все подсписные буквы b Наведите указатель на тот же адрес. Итак, в конце значения должны быть последними, которые я пишу в массиве или нет? –

ответ

1

Вы, кажется, при условии, что

b[i] = a 

вставляет ссылку на a в b. Это не относится к делу. Присвоение срезу массива копирует данные. Такое поведение аналогично назначению slice со списками.

Возможно, путаница возникает из-за того, что она отличается от другой?

a = b[i] 

не копирует, создает вид; это отличается от списка нарезки.

+0

Ah. Хорошо, я думал, что это похоже на Java или C++, где это только ссылка. Спасибо! –

0

Его [0. 0. 0.], потому что:

первые циклы начинаются с "0" поэтому у вас есть для "я" нулевой:

в [J] = 0 * J

все, что умножено на 0, равно нулю.

+0

Да, это ясно. Моя проблема в следующем.Во второй итерации я напишу значения [0,1,2] в массиве a. Теперь скажем, что адрес a равен 0x2A. Таким образом, b [0] указывает на адрес 0x2A и b [1] также указывает на адрес 0x2A. И 0x2A - это массив a, а последние записи, сделанные для a, были [0,1,2]. Таким образом, содержание b должно быть [[0,1,2], [0,1,2]] –

0

Массивы не показывают поведение, которое вы ожидаете, однако списки будут. Смотрите следующий пример:

import numpy as np 

a = np.zeros(3, 'd') 
b = np.zeros(3, 'd') 
c = np.zeros((2,3), 'd') 

c[0] = a 
c[1] = b 

a[1] = 2 
b[0] = 1 

print 'Matrix A: {}'.format(a) 
print 'Matrix B: {}'.format(b) 
print 'Matrix C: {}'.format(c) 

a = [0, 0, 0] 
b = [0, 0, 0] 
c = [a, b] 

a[1] = 2 
b[0] = 1 

print 'List A: {}'.format(a) 
print 'List B: {}'.format(b) 
print 'List C: {}'.format(c) 

Когда мы используем матрицы, c[0] копирует текущее значение a, c[1] делает то же самое для b. Ссылки теряются, поэтому изменения в a и b не влияют на c. Следовательно, мы печатаем:

Matrix A: [ 0. 2. 0.] 
Matrix B: [ 1. 0. 0.] 
Matrix C: [[ 0. 0. 0.] 
[ 0. 0. 0.]] 

Однако для списков ссылки сохраняются. Таким образом, мы выводим:

List A: [0, 2, 0] 
List B: [1, 0, 0] 
List C: [[0, 2, 0], [1, 0, 0]]