Это []
значение по умолчанию привлекает внимание многих людей, поэтому я расскажу об этом в первую очередь.Когда Python запускает ваш код, он делает это:
def append_two(a=[]):
a.append(2)
return a
print(append_two())
print(append_two([1, 2, 3])
print(append_two())
О, смотри!Определение функции!Итак, значение по умолчанию []
;давайте оценим это ... И некоторый код, но давайте пока не будем его запускать.
def append_two(a=<list object at 0x34FE2910>):
...
print(append_two())
print(append_two([1, 2, 3])
print(append_two())
Хорошо, сейчас давайте запустим его.Добавление 2
к []
составляет [2]
, поэтому мы print("[2]")
.Добавление 2
к [1, 2, 3]
делает [1, 2, 3, 2]
, поэтому мы print("[1, 2, 3, 2]")
.Добавление 2
к [2]
составляет [2, 2]
, поэтому мы print("[2, 2]")
.И готово!
[2]
[1, 2, 3, 2]
[2, 2]
Почему это происходит?Ну, это был первый этап.При оценке функции Python создал список по умолчанию для append_two
.А это значит, что если вы не передадите список, он всегда будет добавляться к этому.Этот список будет медленно расти со временем, так как к нему продолжают добавляться 2
.
Причина этого - последовательность.Когда вы запускаете функцию, запускается только содержимое внутри функции.Нигде внутри функции не написано «создать новый список», поэтому это не так.Если вы хотите, вы должны сказать это следующим образом:
def append_two(a=None):
if a is None:
a = [] # Make a new list
a.append(2)
return a
Это неуклюже и раздражает, но это цена, которую вы должны заплатить за последовательность.Альтернативы хуже.
Теперь о вашей главной проблеме.Я немного упросту это.
class DemoClass:
def __getitem__(self, index):
return index
dataset = DemoClass()
style_clms = ["X", "Y"]
print(dataset[style_clms])
Это печатает ['X', 'Y']
.Давайте посмотрим, что напечатает dataset["X", "Y"]
:
>>> print(dataset["X", "Y"])
('X', 'Y')
Хорошо ... Это называется tuple
.Достаточно просто преобразовать list
в tuple
:
>>> print(dataset[tuple(style_clms)])
('X', 'Y')
Ура!Мы успешно реплицировали dataset["X", "Y"]
для произвольных вещей!:-) Надеюсь, это решит вашу проблему.