Неправильно обозначен как дублирующий вопрос. Это не имеет никакого отношения к тому, чтобы не знать, как передать переменную по ссылке. Он спрашивает, есть ли способ смягчить проблемы с сохранением изменяемого необязательного аргумента в качестве параметра без его значения, сохраняющегося в контексте функции при последующих вызовах.Есть ли лучшая альтернатива сохранению изменяемого необязательного аргумента в качестве параметра без его значения, сохраняющегося при последующих вызовах в Python?
Так что я только что это случилось со мной сегодня, и теперь я знаком с этой ловушкой, в которую входят многие новые разработчики Python: изменяемые аргументы по умолчанию. Для краткости, вот пример того, что я везу о:
def MyClass(object):
...
def my_func(self,my_str="default",my_dict={},**kwargs):
my_dict.update(kwargs)
self.my_dict = my_dict
----------------------------------------
<< a = MyClass()
<< a.my_func(foo='bar')
<< a.my_dict
>> {'foo':'bar'}
<< b = MyClass()
<< b.my_func(bar='baz')
<< b.my_dict
>> {'foo': 'bar', 'bar': 'baz'}
Я понимаю, что это намеренное и понять, что это хорошее решение было бы изменить my_func
к этому вместо:
def my_func(self,my_str="default",my_dict=None,**kwargs)
if my_dict is None: my_dict = {}
...
Однако Я не удовлетворен этим. Это просто портит меня неправильно. По умолчанию я не хочу, чтобы он был None. По умолчанию я хочу пустой dict. Так я думал, что сделать это:
def my_func(self,my_str="default", my_dict={}, **kwargs)
my_dict.update(kwargs)
self.my_dict = my_dict
my_dict = {}
Но, конечно, это не будет работать, вы получите такое же поведение, как и раньше. Но почему? Не является my_dict
постоянным и изменчивым? Или только когда это удобно для Python? Есть ли другой способ справиться с этим, кроме простого исключения my_dict
в качестве необязательного аргумента?
Я действительно повесил трубку, потому что считаю полезным использовать аргумент по умолчанию для передачи типа читателю, что повышает читаемость кода IMO. Это хорошо, потому что читателю не нужно было погружаться в функцию, чтобы определить, что my_dict
должен быть dict (inb4, предлагающий «просто использовать комментарии» - идеалистический, но не очень реалистичный для моих целей).
Эта «особенность» имеет мало смысла и настолько невероятно оскорбительна для меня, что я на самом деле очень близок к тому, чтобы поверить, что это действительно ошибка в маскировке. Никто никогда не будет использовать это, и это для меня почти разбойник.
Заранее спасибо.
«Никто никогда не будет использовать это» - неправильно. Я использовал его. Он похож на атрибуты класса и атрибуты экземпляра. – TigerhawkT3
Гипербола. Я уверен, что большинство разработчиков Python, особенно те, которые приходят с языка, где это не функция, не подумали бы использовать его. –
'my_dict' на самом деле изменен, но вы не меняете аргумент' my_dict', вы переназначаете его. – Natecat