Найти - Пользователи
Полная версия: Странное поведение изменяемых keyword-аргументов
Начало » Python для новичков » Странное поведение изменяемых keyword-аргументов
1
MarSoft
Объявляю функцию:
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=… Но это неочевидно.
dimabest
читайте основы от Лутца http://jenyay.net/blog/2009/02/25/mark-lutc-izuchaem-python/

ибо в Питоне еще много таких “багофич” :)
Андрей Светлов
Сделайте dir(f) и догадатесь, где именно хранятся значения для параметров по умолчанию.
o7412369815963
Андрей Светлов
Сделайте dir(f) и догадатесь, где именно хранятся значения для параметров по умолчанию.
__defaults__
func_defaults
apologize828
MarSoft
Объявляю функцию:
def f(x = []):
print 'x:',x
x.append(123)
print 'now x:',x
значение по умолчанию определяется в момент выполнения def. так что, это будет один и тот же список для всех вызовов f(), если хочешь, чтобы каждый раз создавался новый список помести x= в тело самой ф-ции и тогда это будет срабатывать при каждом вызове f()
PS: нужно быть внимательней и осторожней когда работаешь с изменяемыми объектами!!!
MarSoft
Спасибо всем! Теперь понятно… Надеюсь, больше глупых вопросов не возникнет. :) Просто python я начал изучать недавно..
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB