почему список очищает все элементы в другом списке python3? - PullRequest
0 голосов
/ 08 апреля 2020

Я пишу код для групповых анаграмм

strs=["eat", "tea", "tan", "ate", "nat", "bat"]
ans=[]
ra=[]
for i in strs:
    if i in ra:
        continue
    for j in  strs:
        if sorted(i)==sorted(j):
            ra.append(j)

    ans.append(ra)
    ra.clear()
print(ans)

в вышеприведенном коде, он должен напечатать список анаграмм, но вместо этого он печатает пустой список, почему очищается список ансов?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

ans список не очищается, а скорее состоит из нескольких ссылок на ra, который является пустым списком, потому что после вставки элементов вы очищаете его с помощью ra.clear().

Если вы замените ra.clear() на ra = [], вам больше не придется очищать список ra, а вместо этого вы будете создавать новый объект. Другой способ посмотреть, что .clear() удаляет элементы из list, на которые указывает имя ra, а ans.append(ra) не защищает ra от дальнейшей модификации. Вместо этого, выполнив ra = [], вы убедитесь, что ra указывает на новый объект.


Более простой пример, иллюстрирующий проблему:

a = [1, 2, 3]
b = a  # assign `b` to `a`

print(a)
# [1, 2, 3]
print(b)
# [1, 2, 3]

# we modify `a`
a[0] = 10
print(a)
# [10, 2, 3]

# also `b` gets modified
print(b)
# [10, 2, 3]

c = [a] * 4
print(c)
# [[10, 2, 3], [10, 2, 3], [10, 2, 3], [10, 2, 3]]
a[0] = 1
print(c)
# [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
0 голосов
/ 08 апреля 2020

Попробуйте запустить:

strs=["eat", "tea", "tan", "ate", "nat", "bat"]
ans=[]
ra=[]
for i in strs:
    ra=[]
    if i in ra:
        continue
    for j in  strs:
        if sorted(i)==sorted(j):
            ra.append(j)
    ans.append(ra)
print(ans)

Также if i in ra: continue не требуется. Так что лучше запустить:

strs=["eat", "tea", "tan", "ate", "nat", "bat"]
ans=[]
ra=[]
for i in strs:
    ra=[]
    for j in  strs:
        if sorted(i)==sorted(j):
            ra.append(j)
    ans.append(ra)
print(ans)

И почему вы получили пустой список, да, @ norok2 прав.

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