Уведомления

Группа в Telegram: @pythonsu

#1 Март 6, 2011 00:43:15

MarSoft
От:
Зарегистрирован: 2011-03-06
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение изменяемых keyword-аргументов

Объявляю функцию:

def f(x = []):
print 'x:',x
x.append(123)
print 'now x:',x
И вот что получается: если вызываю её, явно указывая значение x, то всё работает нормально. Если же не указываю, то, похоже, для x всегда берётся специальная глобальная переменная, причём даже если эта функция является методом класса - значение будет общим для всех экземпляров класса.
>>> f([2])
x: [2]
now x: [2, 123]
>>> f()
x: []
now x: [123]
>>> f()
x: [123]
now x: [123, 123]
>>> f()
x: [123, 123]
now x: [123, 123, 123]
>>> f([43])
x: [43]
now x: [43, 123]
Это бага или фича? Казалось бы, указывая при объявлении функции "x=", я предполагаю, что если её вызовут как f(), то аргумент получит значение . А получается по-другому…
Проверил, в python3 то же самое.
Пока придумал такой костыль: либо в начале делать x=x (для словарей - x=x.copy()), либо (не всегда подойдёт) в конце - x=… Но это неочевидно.



Отредактировано (Март 6, 2011 00:47:53)

Офлайн

#2 Март 6, 2011 00:53:38

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение изменяемых keyword-аргументов

читайте основы от Лутца http://jenyay.net/blog/2009/02/25/mark-lutc-izuchaem-python/

ибо в Питоне еще много таких “багофич” :)



Офлайн

#3 Март 6, 2011 01:57:32

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Странное поведение изменяемых keyword-аргументов

Сделайте dir(f) и догадатесь, где именно хранятся значения для параметров по умолчанию.



Офлайн

#4 Март 6, 2011 05:55:40

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Странное поведение изменяемых keyword-аргументов

Андрей Светлов
Сделайте dir(f) и догадатесь, где именно хранятся значения для параметров по умолчанию.
__defaults__
func_defaults

Офлайн

#5 Март 6, 2011 11:56:44

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Странное поведение изменяемых keyword-аргументов

MarSoft
Объявляю функцию:
def f(x = []):
print 'x:',x
x.append(123)
print 'now x:',x
значение по умолчанию определяется в момент выполнения def. так что, это будет один и тот же список для всех вызовов f(), если хочешь, чтобы каждый раз создавался новый список помести x= в тело самой ф-ции и тогда это будет срабатывать при каждом вызове f()
PS: нужно быть внимательней и осторожней когда работаешь с изменяемыми объектами!!!



Офлайн

#6 Март 6, 2011 18:17:39

MarSoft
От:
Зарегистрирован: 2011-03-06
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение изменяемых keyword-аргументов

Спасибо всем! Теперь понятно… Надеюсь, больше глупых вопросов не возникнет. :) Просто python я начал изучать недавно..



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version