- 1
- 2
- 3
- 4
- 5
- 6
def f(l = []):
l.append(len(l))
return l
f()
f()
print f()
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−94
def f(l = []):
l.append(len(l))
return l
f()
f()
print f()
Есть мнения что выведет?
http://ideone.com/Q6Oc2I
laMer007 31.01.2014 12:41 # +2
TarasB 31.01.2014 13:30 # +12
guest 31.01.2014 19:38 # −16
Иди на хуй, еболдыш!
Иди на хуй, еболдыш!
Иди на хуй, еболдыш!
Иди на хуй, еболдыш!
roman-kashitsyn 31.01.2014 12:43 # +7
anonimb84a2f6fd141 31.01.2014 21:11 # +3
myaut 31.01.2014 12:58 # +4
kegdan 31.01.2014 13:09 # +5
Ruby [0] выдает
WGH 31.01.2014 13:23 # +13
http://ideone.com/KTzQpn
roman-kashitsyn 31.01.2014 13:31 # +7
guest 31.01.2014 13:52 # +6
x это тупл из листов, т.е. структура в которой лежат константные ссылки на не константные обьекты. При выполнении операции += для элемента тупла сначала вызывается оператор +
для листа и соответственно в лист добавляется 42 затем вызывается оператор = а этот оператор уже пытается изменить адрес листа который константный => вуаля мы ловим ошибку. Как то так.
laMer007 31.01.2014 14:08 # 0
roman-kashitsyn 31.01.2014 14:09 # +4
laMer007 31.01.2014 14:29 # 0
guest 31.01.2014 14:29 # 0
guest 31.01.2014 14:30 # +1
WGH 31.01.2014 14:42 # +2
Нет, не так. += — это самостоятельный оператор, он не раскладывается на + и =. Только мб если __iadd__ вдруг не определен в каком-нибудь пользовательском классе. Но у list __iadd__ определенно есть.
Там происходит что-то такое (то есть он раскладывается на '=' и __iadd__):
x[0] = x[0].__iadd__([42])
С поправкой на то, что x[0] вычисляется только один раз.
WGH 31.01.2014 14:48 # +1
Обращаю внимание на DUP_TOP_TWO: один раз пара (x, 0) используется для BINARY_SUBSCR (__getitem__), второй раз - для STORE_SUBSCR (__setitem__).
guest 31.01.2014 16:18 # +2
guest 31.01.2014 16:26 # +10
guest 31.01.2014 16:51 # +1
anonimb84a2f6fd141 31.01.2014 21:16 # −1
Если iadd меняет сам обьект, то зачем присваивание? И как ты дизассемблил код?
WGH 31.01.2014 21:34 # +1
http://docs.python.org/3.3/library/dis.html
kegdan 31.01.2014 13:35 # 0
orion 31.01.2014 15:37 # +2
kyzi007 31.01.2014 14:49 # +3
tirinox 31.01.2014 15:31 # 0
сразу вспомнилось.
guest 31.01.2014 15:39 # +4
Stertor 31.01.2014 15:46 # −4
LispGovno 31.01.2014 17:20 # 0
guest 31.01.2014 17:28 # −5
guest 31.01.2014 17:49 # −6
anonimb84a2f6fd141 31.01.2014 21:11 # +6
Дефолтовые значения аргументов функции вычисляются при компиляции, изменяемые объекты будут синглтонами. Конечно, большой вопрос - а нахуя так вообще сделали? Я бы назвал это багом.
laMer007 04.02.2014 11:35 # −1
3.14159265 31.05.2014 01:45 # +1
И как я пропустил такой великий тред Победы?!
guest 31.05.2014 04:00 # 0