Я думаю, что предоставленные ответы вводят в заблуждение. Свойство, определенное внутри класса, становится свойством экземпляра, когда объект создается, независимо от того, как вы его определяете. Таким образом, копии a.list
сделаны, а x.list
и y.list
- разные копии. Причина, по которой они кажутся одинаковыми, заключается в том, что они оба являются псевдонимами в том же списке. Но это следствие того, как работают списки, а не того, как работают классы. Если бы вы делали то же самое с числами вместо списков (или просто используя + = вместо append, что создало бы новый список), вы увидите, что изменение x.attr
не влияет на изменение y.attr
.
Определяет self.list
внутри __init__
, потому что функция вызывается дважды, один раз для каждого экземпляра объекта, и поэтому создается два разных списка.
Точка 1 [Программная ошибка]
Проблема заключается в использовании с спецификатором формата %c
. Он считает ранее введенным \n
, сохраненным нажатием клавиши ENTER после предыдущего ввода. Вы хотите
scanf(" %c", &tag[i].owner);
^
|
note the space
пропустить любой ведущий символ пробела, такой как символ (включая \n
) до фактического ввода.
Точка 2 [Логическая ошибка]
В соответствии с вашим кодом здесь, в scan введите string , вам нужно использовать спецификатор формата %s
.
Итак, наконец, ваш код должен выглядеть как
scanf("%s", tag[i].owner); // if tag[i].owner is char array
или
scanf(" %c", &tag[i].owner); // if tag[i].owner is a char, just in case
% c - спецификатор для символа, вы пытаетесь ввести строку, а не символ. См. документацию scanf . То, что вы хотите использовать, - это спецификатор% s для строки.