Аргументы по умолчанию получают оценку во время компиляции функции в объект функции. При использовании этой функции, несколько раз с помощью этой функции, они являются и остаются одним и тем же объектом.
Когда они изменяются, когда они мутируются (например, добавляя к нему элемент), они остаются мутированными по последовательным вызовам.
Они остаются мутированными, потому что каждый раз они являются одним и тем же объектом .
Поскольку список связан с функцией, когда объект функции компилируется и инстанцируется, это:
def foo(mutable_default_argument=[]): # make a list the default argument
"""function that uses a list"""
почти точно эквивалентно этому:
_a_list = [] # create a list in the globals
def foo(mutable_default_argument=_a_list): # make it the default argument
"""function that uses a list"""
del _a_list # remove globals name binding
Вот демонстрация - вы можете проверить, что они являются одним и тем же объектом каждый раз, когда они ссылаются на
example.py
print('1. Global scope being evaluated')
def create_list():
'''noisily create a list for usage as a kwarg'''
l = []
print('3. list being created and returned, id: ' + str(id(l)))
return l
print('2. example_function about to be compiled to an object')
def example_function(default_kwarg1=create_list()):
print('appending "a" in default default_kwarg1')
default_kwarg1.append("a")
print('list with id: ' + str(id(default_kwarg1)) +
' - is now: ' + repr(default_kwarg1))
print('4. example_function compiled: ' + repr(example_function))
if __name__ == '__main__':
print('5. calling example_function twice!:')
example_function()
example_function()
и работает это с python example.py
:
1. Global scope being evaluated
2. example_function about to be compiled to an object
3. list being created and returned, id: 140502758808032
4. example_function compiled:
5. calling example_function twice!:
appending "a" in default default_kwarg1
list with id: 140502758808032 - is now: ['a']
appending "a" in default default_kwarg1
list with id: 140502758808032 - is now: ['a', 'a']
Этот порядок выполнения часто путает новых пользователей Python. Если вы понимаете модель исполнения Python, это становится вполне ожидаемым.
Но поэтому обычная инструкция для новых пользователей заключается в том, чтобы вместо этого создать свои аргументы по умолчанию:
def example_function_2(default_kwarg=None):
if default_kwarg is None:
default_kwarg = []
Это использует None singleton как объект-дозор, чтобы сообщить функции, есть ли у нас аргумент, отличный от значения по умолчанию. Если мы не получаем никакого аргумента, то мы действительно хотим использовать новый пустой список []
в качестве значения по умолчанию.
Как говорится в разделе в разделе управления потоком :
Если вы не хотите, чтобы по умолчанию были разделены между последующими вызовами, вы можете написать такую функцию, как это:
blockquote>def f(a, L=None): if L is None: L = [] L.append(a) return L
У меня была та же проблема. Проведя часы, я наткнулся на решение, что я уже добавил зависимость от «spring-webmvc», но пропустил «spring-web». Поэтому просто установите приведенную ниже зависимость для решения этой проблемы. Если у вас уже есть, просто обновите обе версии до последней версии. Это будет работать точно.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
Перейти к pom.xml
Добавить эту зависимость:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
с помощью командной строки, найдите свою папку: - mvn clean
Я не думаю, что проблема связана с зависимостями. Я предполагаю, что вы получаете эту ошибку в своей среде IDE. Затем просто обновите его. Если это затмение, попробуйте запустить Maven-> Update Dependencies
Я думаю, что вы используете Spring 3.0.5, и вам нужно использовать Spring 4.0. * Это решит вашу проблему. org.springframework.web.bind.annotation.RequestMapping недоступен в Spring-web ранее Spring-web 4.0. *
Чтобы решить, обновите Spring Frame Work до 3.2.0 или выше!
У меня была та же проблема, но я решил по-другому (потому что при щелчке правой кнопкой мыши по папке проекта нет вкладки Maven, только если я это сделаю на pom.xml, я могу увидеть вкладку Maven):
Поэтому я понимаю, что вы получили эту ошибку, потому что среда IDE (Eclipse) не импортировала зависимости от Maven. Поскольку вы используете Spring framework и, вероятно, у вас есть STS allready, щелкните правой кнопкой мыши папку проекта Spring Tools -> Update Maven Dependecies.
Я использую Eclipse JUNO m2eclipse 1.3.0 Spring IDEE 3.1
Это решение WORKS, у меня была такая же проблема, и после нескольких часов я подошел к этому:
(1) Перейдите к вашему pom.xml (2) Добавьте эту зависимость:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
(3) Запустите проект
Я использовал версию весеннего веб-сайта 4.3.7
Сменив его на рабочий 4.1.7, он сразу же решил его.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
У меня была почти такая же проблема, но это было просто потому, что некоторая библиотека .jar не обновлялась.
Я не мог использовать @RequestMapping, потому что просто «мыши над @RequestMapping» и нажмите «Fix ...», а библиотека .jar будет загружаться и устанавливаться.
Иногда в локальном репозитории Maven возникает некоторая ошибка. Поэтому, пожалуйста, закройте свое затмение и удалите jar spring-webmvc из вашего локального .m2, затем откройте Eclipse и в проекте нажмите Update Maven Dependencies.
Затем Eclipse снова загрузит вашу зависимость. Вот как я исправил ту же проблему.
import org.springframework.web.bind.annotation.RequestMapping;
работает. Благодаря! – Sylhare 8 September 2017 в 02:35