Автоматически сгенерированный список не работает должным образом - PullRequest
0 голосов
/ 20 октября 2018

Я нашел хороший способ создания зацикленного списка здесь .И код запускается так, как мне нужно.

x=["alpha","betta", "gamma"]
y=[[] for _ in range(len(x))]
y[1]=3

даст мне [[], 3, []], как и ожидалось.Но когда я попытался увеличить код:

z=[10,20,30]
x=["alpha","betta"]
y=[[] for _ in range(len(z))]
y=[y for _ in range(len(x))]
y[1][1]=4

даст мне правильную форму, но я получу [[[], 4, []], [[], 4, []]]

вместо [[[], [], []], [[], 4, []]] Я, очевидно, попал в ловушкуупоминается в ссылке, но я не понимаю, почему и как избежать этой проблемы

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

это решение устраняет проблему, которую вы демонстрируете, но что, если вы сделаете это вместо этого:

y=[[] for _ in range(len(z))]
y=[y.copy() for _ in range(len(x))]
y[1][1].append(12)

здесь я использую ссылку на список, а не перезаписываю ее, поэтому я получаю:

[[[], [12], []], [[], [12], []]]

Черт.Почему это?поскольку copy создает мелкую копию, вам необходимо deepcopy

import copy
y=[copy.deepcopy(y) for _ in range(len(x))]
y[1][1].append(12)

отпечатков:

[[[], [], []], [[], [12], []]]

теперь выберите тот, который лучше всего соответствует вашим потребностям.

0 голосов
/ 20 октября 2018

Здесь ваш код работает неправильно:

y=[y for _ in range(len(x))]

Поскольку вы по сути создаете два указателя на один и тот же список (т. Е. Y).Вместо этого вы можете попробовать что-то вроде этого:

y=[y.copy() for _ in range(len(x))]

, что решает вашу проблему, так как вы создаете новые списки.

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