Создание списка списков путем умножения списка оставляет внутренние списки подключенными - PullRequest
2 голосов
/ 29 октября 2019

Допустим, я хочу создать список списков для последующего заполнения, который выглядит следующим образом:

[['', ''], ['', ''], ['', '']]

Я могу создать его так:

rows=3
cols=2

A=['']*cols
B=[A[:]]*rows

Однако,внутренние списки - это один и тот же объект, как можно видеть:

B[0][0]='!'
print (B)

Вывод:

[['!', ''], ['!', ''], ['!', '']]

Это происходит, хотя я использовал B=[A[:]]*rows вместо B=[A]*rows;использование B=[A][:]*rows не решает проблему.

Если A[:] должно эффективно создать полную копию (а не просто ссылку) путем разрезания A, то почему это происходит?

PS

Очевидно, что это можно легко решить, например, с помощью:

this_text=[]
temp=[]
for i in range(cols):
    A.append('')
for i in range(rows):
    B.append(A[:])

Моя цель - улучшить понимание, а не создавать этот конкретный список списков.

Ответы [ 2 ]

3 голосов
/ 29 октября 2019

Это не позволит B быть списком копий, поскольку он создает новый A[:] для каждого x:

B=[A[:] for x in range(rows)]
2 голосов
/ 29 октября 2019
B=[A[:]]*rows

принимает то же самое list экземпляр ['' * cols] строка раз.

Изменение одной ссылки на указанный экземпляр повлияет на все ссылки.

Вместо этого используйте понимание для создания независимых списков.

B=[A[:] for x in range(rows)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...