powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Phyton Вопрос новичка про списки и множества
5 сообщений из 5, страница 1 из 1
Phyton Вопрос новичка про списки и множества
    #39774678
Печорин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть два фрагмента кода. Первый работает правильно. Второй - нет. Просто хотел сразу сделать список из множеств вместо того, чтобы по очереди переводить каждый список в множество. Подскажите, пожалуйста, почему второй код так себя ведёт! В момент vse |= M[i] он меняет то, что не хотелось бы.. например, M[0].

1.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
N = int(input())
M = [0] * N
for i in range(N):
    J = int(input())
    M[i] = ['0'] * J
    for j in range(len(M[i])):
        M[i][j] = input()
even = set(M[0])
vse = set(M[0])
for i in range(N):
    M[i] = set(M[i])
    even &= M[i]
    vse |= M[i]
print(len(even))
even = list(even)
for i in range(len(even)):
    print(even[i])
print(len(vse))
vse = list(vse)
for i in range(len(vse)):
    print(vse[i])



2.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
N = int(input())
M = [0] * N
for i in range(N):
    J = int(input())
    M[i] = set()
    for j in range(J):
        M[i].add(input())
even = M[0]
vse = M[0]
for i in range(N):
    even &= M[i]
    vse |= M[i]
print(len(even))
even = list(even)
for i in range(len(even)):
    print(even[i])
print(len(vse))
vse = list(vse)
for i in range(len(vse)):
    print(vse[i])
...
Рейтинг: 0 / 0
Phyton Вопрос новичка про списки и множества
    #39774727
Печорин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное, тут кроется в момент:
1.
even = set(M[0])
vse = set(M[0])
2.
even = M[0]
vse = M[0]

В первом случае по ссылке even и по ссылке M[0] будут разные объекты.
А во втором случае even и M[0] показывают на один объект. Так?
А как сделать, чтобы по ссылке even жил отдельный объект? Я думал, что так как множество изменяемый объект, то при таком присвоении будет создаваться копия (новый объект).

Прошу прощения, если брежу. Я только осваиваю ).
...
Рейтинг: 0 / 0
Phyton Вопрос новичка про списки и множества
    #39774810
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Печорин,

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
M = [set(input() for j in range(int(input()))) for i in range(int(input()))]

even = set().union(M[0])
vse = set().union(M[0])
for i in M:
    even &= i
    vse |= i

print(len(even))
for i in even:
    print(i)

print(len(vse))
for i in vse:
    print(i)



У Вас как-то слишком много преобразований в коде, которые никому не нужны :) Хотя зная как устроен питон, почти наверняка можно красивее. Я прост тоже только учусь.
...
Рейтинг: 0 / 0
Phyton Вопрос новичка про списки и множества
    #39774960
Печорин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр,

большое спасибо за Ваш вариант!
А на вопрос есть ответ?
Я правильно понимаю, что ключевое отличие между моим вторым вариантом и Вашим в следующем моменте?
even = set().union(M[0])

В моём случае, где я пишу просто even = M[0], в дальнейшем, когда я меняю even, то меняется и M[0] так? А в Вашем, когда меняется even, то M[0] не меняется. То есть, у меня even и M[0] - это один объект, а у Вас они разные.. Как-то так?
...
Рейтинг: 0 / 0
Phyton Вопрос новичка про списки и множества
    #39774997
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПечоринПрограмёр,

большое спасибо за Ваш вариант!
А на вопрос есть ответ?
Я правильно понимаю, что ключевое отличие между моим вторым вариантом и Вашим в следующем моменте?
even = set().union(M[0])

В моём случае, где я пишу просто even = M[0], в дальнейшем, когда я меняю even, то меняется и M[0] так? А в Вашем, когда меняется even, то M[0] не меняется. То есть, у меня even и M[0] - это один объект, а у Вас они разные.. Как-то так?

Да, он похоже по ссылке множества передаёт (ну то есть переменную направляет на множество, а не создаёт копию). Ну по крайней мере я изначально написал как у Вас и получил ту же фигню (оно мне нулевой элемент прямо в M изменило)... Мне тоже это непривычно слегка, потому что я сам с пхп, а там массивы по ссылке уже 100 лет как не передаются (я уже даже не помню передавались ли они там вообще так, или я с каким-нить паскалем путаю)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Phyton Вопрос новичка про списки и множества
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]