Недоразумение Обзора Python / Статическое Недоразумение

Чтобы показать, какую версию PNG dll требуется для вашей версии Emacs для Windows, вы можете оценить (cdr (assq 'png dynamic-library-alist))

6
задан Raymond Berg 31 October 2009 в 17:11
поделиться

4 ответа

В вашем коде есть аргумент по умолчанию для инициализации класса. Значение аргумента по умолчанию оценивается один раз во время компиляции, поэтому каждый экземпляр инициализируется одним и тем же списком. Измените его так:

def __init__(self, arr=None):
    if arr is None:
        self.array = []
    else:
        self.array = arr

Я обсуждал это более подробно здесь: Как определить класс в Python

2
ответ дан 9 December 2019 в 22:36
поделиться

Никогда не используйте изменяемое значение (например, []) для аргумента метода по умолчанию. Значение вычисляется один раз, а затем используется для каждого вызова. Когда вы используете пустой список в качестве значения по умолчанию, этот же список используется каждый раз, когда метод вызывается без аргумента, даже если значение изменяется предыдущими вызовами функций.

Сделайте это вместо:

def __init__(self,arr=None):
    self.array = arr or []
8
ответ дан 9 December 2019 в 22:36
поделиться

Как говорит Нед, проблема в том, что вы используете список в качестве аргумента по умолчанию. Более подробная информация здесь . Решение состоит в том, чтобы изменить функцию __ init __ , как показано ниже:

       def __init__(self,arr=None):
           if arr is not None:
               self.array = arr
           else:
               self.array = []
1
ответ дан 9 December 2019 в 22:36
поделиться

Из документации по varargs :

Три периода после финала тип параметра указывает, что последний аргумент может быть передан как Этот подход не всегда правильный ответ: в других случаях лучше «если не Нет». Просто спросите себя: я передаю набор объектов или изменяемый контейнер? Если класс / функция, в которые я передаю свои объекты, изменяет хранилище, которое я ему предоставил, будет ли это (а) удивительным или (б) желательным? В этом случае я бы сказал, что это (а); таким образом, вызов list (...) - лучшее решение. Если (б), «если не Нет» было бы правильным подходом.

0
ответ дан 9 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: