2013-09-22 2 views
0

Я не знаю, является ли это ошибка, или я неправильно семантический смысл * лексемы в массивах:Инициализация матрицы python3

>>> arr = [None] * 5 # Initialize array of 5 'None' items 
>>> arr 
[None, None, None, None, None] 
>>> arr[2] = "banana" 
>>> arr 
[None, None, 'banana', None, None] 
>>> # right? 
... 
>>> mx = [ [None] * 3 ] * 2  # initialize a 3x2 matrix with 'None' items 
>>> mx 
[[None, None, None], [None, None, None]] 
>>> # so far, so good, but then: 
... 
>>> mx[0][0] = "banana" 
>>> mx 
[['banana', None, None], ['banana', None, None]] 
>>> # Huh? 

Является ли это ошибка, или я получил неправильный семантический значение маркера __mult__?

ответ

1

Вы копируете одну и ту же ссылку в список несколько раз. Делают это так:

matrix = [[None]*3 for i in range(2)]

+0

Итак, то, что именно смысл '*' фишку? Если он копирует ссылку на объект, тогда я должен ожидать, что в первой части при передаче 'arr [2] =" banana "список должен быть' ['banana', 'banana', 'banana ',' banana ',' banana '] ', а не выше. – user2804578

+0

О, просто натолкнулся на ответ [в другом месте на StackOverflow] (http://stackoverflow.com/questions/9658459/initializing-matrix-in-python-using-0xy-creates-linked-rows/9658522#9658522) Однако, Я считаю довольно странным, что токен '*' не имеет такого же значения в списке, как и для других типов элементарных данных. – user2804578

+0

На самом деле это имеет то же значение. Просто для неизменных типов выполнение таких операций, как «копирование», всегда создает новый объект, которому присваивается одно и то же значение, тогда как изменяемые объекты просто копируют свою ссылку. Вот еще несколько хороших чтений о том, что означает, что тип неизменен. http://stackoverflow.com/questions/8056130/immutable-vs-mutable-types-python – Ben

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