Матрица Python разделяет значения строк - PullRequest
0 голосов
/ 25 апреля 2019

Итак, у меня есть вопрос по созданию матрицы, но я не уверен, почему значения являются общими?Не уверен, из-за того, что последовательность является ссылочным типом или нет?

Если вы напишите этот код в pythontutor, вы обнаружите, что основной кортеж указывает на один и тот же кортеж строки и является общим.Я понимаю, что если бы я сделал return row*n, он был бы доступен для общего доступа, но Почему при объединении кортежей или добавлении списков, почему он затем будет использоваться совместно (ссылаясь на тот же адрес памяти) ?

def make_matrix(n):
    row = (0, )*n
    board = ()
    for i in range(n):
        board += (row,)
    return board

matrix = make_board(4)
print(matrix)

По сравнению с этим кодом, где каждая строка отдельно (0,0,0,0) и не используется совместно.

def make_board(n):
    return tuple(tuple(0 for i in range(n)) for i in range(n))

matrix = make_board(4)
print(matrix)

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

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

row = (0, )*n
for i in range(n):
    board += (row,)

Во втором примере вы создаете новые кортежи для каждого дополнения:

tuple(0 for i in range(n)) for i in range(n)

Что эквивалентно:

for i in range(n):
    row = tuple(0 for i in range(n))
    board += (row,)

Таким образом, когда один и тот же кортеж добавляется несколько раз, вы «делитесь» им несколько раз.

0 голосов
/ 25 апреля 2019

Когда вы умножаете кортеж, вы фактически не умножаете его содержимое. Вы создаете ссылки на свой адрес памяти. Таким образом, если вы редактируете содержимое исходной переменной, все переменные, которые совместно используют ее адрес памяти, также изменяются.

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