Я думаю, что предоставленные ответы вводят в заблуждение. Свойство, определенное внутри класса, становится свойством экземпляра, когда объект создается, независимо от того, как вы его определяете. Таким образом, копии a.list
сделаны, а x.list
и y.list
- разные копии. Причина, по которой они кажутся одинаковыми, заключается в том, что они оба являются псевдонимами в том же списке. Но это следствие того, как работают списки, а не того, как работают классы. Если бы вы делали то же самое с числами вместо списков (или просто используя + = вместо append, что создало бы новый список), вы увидите, что изменение x.attr
не влияет на изменение y.attr
.
Определяет self.list
внутри __init__
, потому что функция вызывается дважды, один раз для каждого экземпляра объекта, и поэтому создается два разных списка.
Оператор двоеточия будет иметь приоритет над арифметическими операциями. Всегда лучше экспериментировать с примерами, чтобы усвоить логику:
2*2:6-1
Какой ответ мы должны ожидать? Некоторые скажут 4 5
. Мысль состоит в том, что он упростится до 2*2=4
и 6-1=5
, поэтому 4:5
.
2*2:6-1
[1] 3 5 7 9 11
Этот ответ удивит всех, кто не рассмотрел порядок операций в игре. Выражение 2*2:6-1
упрощается по-разному. Сначала выполняется последовательность 2:6
, затем умножение и, наконец, добавление. Мы могли бы записать его как 2 * (2 3 4 5 6)
, который 4 6 8 10 12
и вычесть 1
из этого, чтобы получить 3 5 7 9 11
.
. Сгруппировавшись с скобками, мы можем контролировать порядок операций, как мы это сделали аналогично в основной арифметике, чтобы получить ответ, который мы сначала ожидали.
(2*2):(6-1)
[1] 4 5
Вы можете применить это рассуждение к вашему примеру, чтобы исследовать кажущееся странным поведение оператора :
.
Теперь, когда вы знаете секретные коды, чего мы должны ожидать от (2*2):6-1
?
nrow(planets_df)-3:nrow(planets_df)
оценивается как 8 - (3: 8) или
(8-3) (8-4) (8-5) (8-6) (8-7) (8-8) = 5 4 3 2 1 0
Если вы хотите использовать последние несколько строк, используйте tail(planets_df, 3)
Двоеточие :
отделяет начальную точку от конечной точки последовательности. Он обрабатывается с более высоким приоритетом, чем оператор +
или -
. Поэтому
nrow(planets_df)-3:nrow(planets_df)
равно
nrow(planets_df) - (3:nrow(planets_df))
. Если вы хотите иметь последние три записи, используя этот синтаксис, вам нужно поместить все выражение, определяющее начало последовательность в скобки:
planets_df[(nrow(planets_df)-3):nrow(planets_df),]