$ 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. Но данное конкретное место вызывает у меня резкое отвращение.
May 4 2010, 20:04:30 UTC 2 years ago
def f(x, y = ff()):
....
May 4 2010, 20:11:31 UTC 2 years ago
Вообще-то, достаточно разумная оптимизация -- зачем передавать объект в качестве дефолтного значения параметра (то есть не возвращать его наружу) и при этом менять его внутри функции?
May 4 2010, 20:19:31 UTC 2 years ago
May 4 2010, 20:21:15 UTC 2 years ago
May 4 2010, 20:22:51 UTC 2 years ago
May 4 2010, 20:26:10 UTC 2 years ago
May 4 2010, 20:49:41 UTC 2 years ago
May 4 2010, 21:00:17 UTC 2 years ago
Вот если a = {}, то a -- не константа, да. Но это не объясняет синтаксиса, в котором {} может означать невесть что.
May 4 2010, 21:16:57 UTC 2 years ago
>>> {}[1]=2; print {}
{}
>>> a={}; a[1]=2; print a
{1: 2}
May 4 2010, 21:22:39 UTC 2 years ago
{}[1] = 2
означает, что {} -- не константа.
2 years ago
May 4 2010, 21:21:22 UTC 2 years ago
{}.setdefault("key", "value")
May 4 2010, 21:23:21 UTC 2 years ago
def foo(x, y=dict()):
pass
все что до первого отступа -- часть конструкции def и выполняется "одновременно с ней" и одноразово. В замыкание попадает созданый экзепляр.
May 4 2010, 21:27:08 UTC 2 years ago
May 5 2010, 21:31:31 UTC 2 years ago
May 5 2010, 07:24:58 UTC 2 years ago
$ ./4
0x100000f00
0x100000f00
для вот такого кода:
$ cat 4.c
#include
$ ./4
0x100000f00
0x100000f00
для вот такого кода:
$ cat 4.c
#include <stdio.h>
int main(){
f();
f();
}
void f(int a){
char *s = "Test";
printf("%p\n", s);
}
May 5 2010, 09:08:23 UTC 2 years ago
2 years ago
May 5 2010, 07:26:01 UTC 2 years ago
2 years ago
2 years ago
May 4 2010, 22:20:48 UTC 2 years ago
... Государственный разъяснитель третьего ранга ...
May 4 2010, 22:24:44 UTC 2 years ago
... Ice tu ei, hoi Brutus? ...
May 5 2010, 19:10:03 UTC 2 years ago
May 5 2010, 19:12:34 UTC 2 years ago
May 5 2010, 20:47:14 UTC 2 years ago
May 5 2010, 21:17:58 UTC 2 years ago
May 5 2010, 21:29:05 UTC 2 years ago
September 30 2010, 05:24:41 UTC 1 year ago