November 2016

S M T W T F S
  1 2345
6789101112
13141516171819
20212223 242526
27282930   

Style Credit

Expand Cut Tags

No cut tags
Tuesday, May 4th, 2010 10:47 pm

$ python
Python 2.6.5 (r265:79063, Mar 31 2010, 18:32:31)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(x, y={}):
... y[x]=1
... print y
...
>>> f(1)
{1: 1}
>>> f(2)
{1: 1, 2: 1}
>>>


Они называют это деталями реализации.

Апдейт для непонятливых:

1. Мне не нужно объяснять, *почему* оно так работает. Я понимаю.

2. Я ничего против питона не имею. Очень приятный язык, лучше многих.

3. Но данное конкретное место вызывает у меня резкое отвращение.
Tuesday, May 4th, 2010 08:04 pm (UTC)
я это понял когда хотел сделать что-то типа

def f(x, y = ff()):
....
Tuesday, May 4th, 2010 08:11 pm (UTC)
Может, это случайность, но я вот в курсе. (На питоне не писал, но слышал студенческий доклад.)

Вообще-то, достаточно разумная оптимизация -- зачем передавать объект в качестве дефолтного значения параметра (то есть не возвращать его наружу) и при этом менять его внутри функции?
Tuesday, May 4th, 2010 08:22 pm (UTC)
ну вообще это предсказуемая вещь. где-то встречал и в описаниях и в тестах.
Tuesday, May 4th, 2010 08:49 pm (UTC)
вообще-то не уродство а вполне предсказуемая вещь. {} - это же не константа.
Tuesday, May 4th, 2010 09:22 pm (UTC)
Ты лукавишь. Возможность записи
{}[1] = 2
означает, что {} -- не константа.
Tuesday, May 4th, 2010 09:21 pm (UTC)
Вот пример, не шибко осмысленный, но ты не просил, чтобы был смысл:
{}.setdefault("key", "value")
Tuesday, May 4th, 2010 09:23 pm (UTC)
{} это синтаксический сахар для dict()

def foo(x, y=dict()):
pass

все что до первого отступа -- часть конструкции def и выполняется "одновременно с ней" и одноразово. В замыкание попадает созданый экзепляр.
Wednesday, May 5th, 2010 09:31 pm (UTC)
Спасибо, хороший пример для объяснения, что такое "синтаксический сахар". Я более сложные часто привожу зачем-то.
Wednesday, May 5th, 2010 07:24 am (UTC)
Скажи, а вот такой результат тебя удивляет ?
$ ./4
0x100000f00
0x100000f00

для вот такого кода:
$ cat 4.c
#include
[Error: Irreparable invalid markup ('<stdio.h>') in entry. Owner must fix manually. Raw contents below.]

Скажи, а вот такой результат тебя удивляет ?
$ ./4
0x100000f00
0x100000f00

для вот такого кода:
$ cat 4.c
#include <stdio.h>

int main(){
f();
f();
}

void f(int a){
char *s = "Test";
printf("%p\n", s);
}

Wednesday, May 5th, 2010 10:12 am (UTC)
я за то что это один объект. в питоне {} - это не константа, а instance объекта dict. но все так же один объект, просто что segfault не геренится когда ты его меняешь.
Wednesday, May 5th, 2010 07:26 am (UTC)
объясняет, ибо {} раскрывается всего один раз при объявлении функции, а не каждый раз при ее вызове.
Wednesday, May 5th, 2010 10:14 am (UTC)
обычный синтаксис. просто надо понимать что {} это не константа.
Tuesday, May 4th, 2010 10:20 pm (UTC)
Кстати, раз уж ты на эти грабли наступил, лови полезное следствие: в конструктор collections.defaultdict передаётся не значение по умолчанию, а фабрика значений по умолчанию. То есть, например, не defaultdict({}), а defaultdict(dict()). Причина теперь должна быть понятна. К счастью, все имена встроенных типов являются фабриками полезных "пустых" значений. int() возвращает ноль, поэтому идиоматично писать defauldict(int). Но, если очень хочется, можно и defauldict(lambda:0), работать будет так же, только медленнее. ;-)

... Государственный разъяснитель третьего ранга ...

Tuesday, May 4th, 2010 10:24 pm (UTC)
Опечатка: должно быть defaultdict(dict). Пустая пара скобок после dict была лишняя.

... Ice tu ei, hoi Brutus? ...

Wednesday, May 5th, 2010 07:10 pm (UTC)
Кстати, не ты ли мне показывал собственный код на C, в котором была static переменная внутри функции? И не понимал, почему мне это не нравится? В чем тут существенная разница, кроме того, что ты знаешь C и значение слова static в нем?
Wednesday, May 5th, 2010 08:47 pm (UTC)
Ну с точки зрения человека, не знающего C (тут я фантазирую) -- еще одно слово, что значит -- не знаю. Не иначе, оптимизация какая, типа register. Или ограничение, как volatile или restrict. Кто ж мог подумать, что оно ТАК меняет семантику! Уродство! (C)
Wednesday, May 5th, 2010 09:29 pm (UTC)
Да-да, в этом он (тип) у нас с тобой совпадает. :)
Thursday, September 30th, 2010 05:24 am (UTC)
Вспомним еще фортран.