
Ignalion
03.07.2017
19:30:30
То вывело бы от 0 до 9

Nikolay
03.07.2017
19:30:37
наоборот
в питоне всегда передача по ссылке же

Ignalion
03.07.2017
19:30:47
А выведет десять девяток

Google

Nikolay
03.07.2017
19:30:55
я эту задачу на собеседованиях задаю часто, да :)

Ignalion
03.07.2017
19:30:57
А в джавочке например такой финт ушами не пройдет

Igor
03.07.2017
19:31:01
Так это late-binding называется

Alexander
03.07.2017
19:31:04

Nikolay
03.07.2017
19:31:07
и еще прошу вставить в код три символа, чтобы его исправить

Igor
03.07.2017
19:31:19
Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.
От этого они не перестают быть кложурами

Nikolay
03.07.2017
19:31:39

Ignalion
03.07.2017
19:31:39
Связывание — это ок. Я о том, что эта переменная в условии фора.
И более того. Она доступна за его пределами
Так что. Не создает
А. Надо присвоить, придется три

Nikolay
03.07.2017
19:32:21
Один?
не, один не прокатит

Google

Alexander
03.07.2017
19:32:23
те же яйца, только в профиль
Нет, не те же.
def foo(x):
x.append(42)
print "foo1", x
def bar(x):
x = x + [100500]
print "foo2", x
y = ["hello", "world"]
foo(y)
print "main", y
bar(y)
print "main", y

b0g3r
03.07.2017
19:33:49
Второе это extend

Ignalion
03.07.2017
19:34:03
Тут ещё можно начать разглагольствовать о том что
x = 2
def f():
print(x)
def g():
print(x)
x = 5
Функция g() упадет на принте

Nikolay
03.07.2017
19:34:42
конструктор копирования же, если говорить в терминах С++

Ignalion
03.07.2017
19:35:28
Но в общем, как любой нормальный старый язык, питон — ужасное говно и набор костылей. Сомнительных.
И если копать глубже, становится стремительно хуже.
Например, вызов деструктора объектов не гарантируется.
Течёт (!) рекурсия (!!) нестед функций. Это вообще адище

Igor
03.07.2017
19:36:20
https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/

ilya
03.07.2017
19:36:29
? так, потные руки от питона убрал ??

Ignalion
03.07.2017
19:36:31

Nikolay
03.07.2017
19:37:01
а про рекурсию в питоне мы уже как-то обсуждали, что она в текущем виде бесполезна)

Alexander
03.07.2017
19:37:51

Ignalion
03.07.2017
19:38:03

Nikolay
03.07.2017
19:38:20
это просто коллбэк

Ignalion
03.07.2017
19:38:36

Tony
03.07.2017
19:38:36

Nikolay
03.07.2017
19:38:43
с деструкторами в том же C++ он связан чуть более, чем никак

Google

wf
03.07.2017
19:39:52
течет?

Ignalion
03.07.2017
19:40:32
не знаю, первый раз от тебя это услышал
I learned it hard way:)
Мы сначала нашли мемори лик, потом долго курили где, а потом нашли баг в 2.7 питоне.
Что-то такое
def f1():
def f2():
while <condition>:
f2()
Течёт до перезапуска интерпретатора

Alexander
03.07.2017
19:41:03
конечно же связан, хотя довольно разные вещи

Ignalion
03.07.2017
19:41:28
В общем, поливать говном питон кто-кто, а питонщики могут долго и со вкусом)

Nikolay
03.07.2017
19:41:30

Alexander
03.07.2017
19:41:49
ок, fair enough :)

Nikolay
03.07.2017
19:41:53
но в C++ GC нет в принципе, так что не совсем корректное сравнение

Ignalion
03.07.2017
19:42:12

Nikolay
03.07.2017
19:42:14
меня вот в исходниках питона удивило злоупотребление словом register

Ignalion
03.07.2017
19:44:35

Nikolay
03.07.2017
19:44:46
ибо все современные компиляторы либо его игнорируют совсем, либо гораздо лучше оптимизируют без него

Ignalion
03.07.2017
19:46:58
А ещё дефолтный питон под Винду собран без использования winsock2 еррор-кодов.
Это уже больше косяк разработчиков либ, конечно, но если вдруг у тебя ембеддед питон и ты захочешь включить как надо, то с вероятностью 99% при попытке переслать в сокет что-то большое упадешь на WSAEWOULDBLOCK
Я могу долго)

wf
03.07.2017
19:48:19
хз, если правильно считать количество ссылок на объект то __del__ никогда не подводит

Python'ер
03.07.2017
19:48:24
Вообще по идее можно любой язык долго и со вкусом обмазывать экскрементами.
Лишь брейнфак идеален. :)

Ignalion
03.07.2017
19:49:56

Google

Ignalion
03.07.2017
19:50:13

ultranoise ?
03.07.2017
19:51:29
А как растик устроен? На каких принципах?

Igor
03.07.2017
19:51:29

Ignalion
03.07.2017
19:52:23
А и ещё. Кстати
Это уже детали реализации питона, но ты не можешь заоверрайдить len() потому что integer is required
И
__contains__

Aragaer
03.07.2017
19:53:07
ну на самом деле слово register означает, что попытка взять адрес этой хрени сразу выдаст ошибку компиляции

wf
03.07.2017
19:53:38

Aragaer
03.07.2017
19:54:08
а вот дальше уже компилятор может как угодно это игнорить - но раз адрес нигде не берется, то может и действительно в регистр засунуть

Admin
ERROR: S client not available

Igor
03.07.2017
19:54:51
There is a reason actually. The mere fact that you cannot take a address of the variable yields some optimization opportunities: the compiler can prove that the variable will not be aliased

Ignalion
03.07.2017
19:55:12

Igor
03.07.2017
19:55:14
Aragaer, спасибо, не знал про это


Ignalion
03.07.2017
19:56:28
Там БОЛЬШОЙ варнинг
Warning Due to the precarious circumstances under which __del__() methods are invoked, exceptions that occur during their execution are ignored, and a warning is printed to sys.stderr instead. Also, when __del__() is invoked in response to a module being deleted (e.g., when execution of the program is done), other globals referenced by the __del__() method may already have been deleted or in the process of being torn down (e.g. the import machinery shutting down). For this reason, __del__() methods should do the absolute minimum needed to maintain external invariants. Starting with version 1.5, Python guarantees that globals whose name begins with a single underscore are deleted from their module before other globals are deleted; if no other references to such globals exist, this may help in assuring that imported modules are still available at the time when the __del__() method is called.
It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
И вот в самом описании


wf
03.07.2017
19:58:34
так тут смысл то в другом

Ignalion
03.07.2017
19:59:56
Смысл примерно такой.
Рассказываю жизненную охуительную историю.
Если вдруг тебе придет в голову не очень здравая идея сделать объект tmp файла и создать его в init и удалить в del - то неожиданно может оказаться, что по выходу из интерпретатора del не успеет выполнится. И твой файл не удалится
я устал экранировать)
Хотя вообще так, конечно, писать не надо:)

Pavel
03.07.2017
20:01:51
казалось бы, зачем придумали __enter__ и __exit__?

Google

wf
03.07.2017
20:01:51
это понятно, но ведь "дел" не для таких вещей!

Ignalion
03.07.2017
20:02:24
Ну вот я об этом и говорю, что он _может_ не выполнится
Ну да ладно. Хватит, пойду поиграю в видеоигры и завтра пойду опять писать на питоне:)

Nikolay
03.07.2017
20:04:08

Roman
03.07.2017
20:05:39
Что-то asyncio как рак: где-то появился и дальше расползается по коду

Nikolay
03.07.2017
20:06:47

ultranoise ?
03.07.2017
20:07:11
ЖО

Roman
03.07.2017
20:08:34

Nikolay
03.07.2017
20:08:41

Roman
03.07.2017
20:09:03
Запусти в короутине while 1: random.random()

Nikolay
03.07.2017
20:10:13

Roman
03.07.2017
20:10:19
В гошечке оно не завесит вообще все

Nikolay
03.07.2017
20:10:44
ну так в гошечке потоки же, где надо

Roman
03.07.2017
20:10:54
А в asyncio - это верная смерть

Nikolay
03.07.2017
20:11:19

Roman
03.07.2017
20:11:53