Python [0] * n синтаксис работает только на неизменяемом объекте? - PullRequest
2 голосов
/ 15 апреля 2020
a = [[0]*3] * 4
print(a[0] is a[1]) # True

когда я инициализировал двумерный массив таким образом, все пошло не так. Мне понадобилось немного времени, чтобы найти это неожиданное поведение. Так работает ли этот синтаксис только на неизменяемом объекте?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Это "сработало" и в вашем примере, по-своему. Именно так реализация list.__mul__ интерпретирует то, что вы хотите. Список не может создавать новые объекты, он не знает, как создавать новые объекты из любых объектов, которые он содержит. Он расширяет себя новыми ссылками на эти объекты.

Вы получаете то же поведение с неизменяемыми целыми числами

>>> x = [0] * 3
>>> x[0] is x[1]
True

Вы можете получить двумерный массив с помощью

>>> a = [[0]*3 for _ in range(4)]
>>> a[0] is a[1]
False

Причина, по которой [0] * 3 делает то, что вам нужно, заключается в том, что он создает список, содержащий 3 ссылки на один и тот же неизменяемый 0.

0 голосов
/ 15 апреля 2020

Что пошло "wrong"? Это делает двумерный список. (Я не знаю, если это так, но я хочу сказать, что это делает список в форме, где вы можете преобразовать его в 2-D массив). Чтобы преобразовать его в правильный массив, вам нужно будет использовать

import numpy as np
a = [[0]*3] * 4
a = np.array(a)

. Вы можете сделать его неизменным, преобразовав его в кортеж.

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