?

Log in

No account? Create an account

Живой Журнал Максима Дементьева

Все записи открытые. Комментировать может любой. Не стесняйтесь! :-)


Предыдущий пост Поделиться Следующий пост
Значения по-умолчанию в параметрах определений функций в Питоне: они возвращаются!!!
Hacker Emblem, glider
mpd
Блин, вляпался таки! Всеми лапками! Помните дети!
Эти значения - вычисляются и потом эти изменяемые значения продолжают передаваться в том же виде в последующих вызовах. Читаем The Python Language Reference / 8. Compound statements / 8.6. Function definitions:

Default parameter values are evaluated from left to right when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. This is generally not what was intended. A way around this is to use None as the default, and explicitly test for it in the body of the function, e.g.:

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin


  • 1

Re: (may I suggest not modifying things?)

Yes!
But wait a minute...
Do you want to give me advice?
Or do you want to suggest this to the authors of the language?

Вот не зря мне Питон не нравится :)

Re: не зря мне Питон не нравится :)

Ну, разным людям Питон не нравится по-разному... Тебе, вот, чем именно?

Мы ещё не услышали, что скажет этому поводу Кальтенбруннер great_mahatma?

Когда я работал в большой интернациональной финансовой структуре в Москве, на кухне стал участником такого разговора. Люди из соседнего проекта обсуждали кое-что, я заикнулся про Питон, так они сказали, что совершенно невозможно применять этот язык на практике! Я поинтересовался, а почему, собственно? Ответ был таким:
  — Там же из-за отступов нельзя вот так из одного места программы в другое скопировать текст без последующего выравнивания по месту!
Не знаю, что подумали обо мне те коллеги, но я о них подумал, что не хочу с ними работать, если они вот так вот хаотично копируют блоки из одного места в другое без адаптации по месту.

Re: не зря мне Питон не нравится :)

>Мы ещё не услышали, что скажет этому поводу Кальтенбруннер great_mahatma?

Сказал. Но опять мой камент отмечен как подозрительный. Наверное из-за того, что в нём картинка.

Re: не зря мне Питон не нравится :)

Я вижу его в ин-боксе, но не вижу его ни в подозрительных, ни в открытых.
О, ВЕЛИКИЙ! Ты - взломал своим комментом весь ЖЖ!!!

Re: не зря мне Питон не нравится :)

Я умею! :-) Я ХАКОР!!! :angry:

попробую тот же ответ, но без картинки

Я не работал с тобой вместе "в большой интернациональной финансовой структуре в Москве", просто процитирую кусочек лога из своего скайпа за декабрь 2013-го года:

Friday, December 27, 2013

...

[2:40:25 PM] Великий Махатма: мне Питон не нравится. никак не могу привыкнуть что вместо "египетских скобок" или begin/end стейтменты и скоупы выделяются просто индентацией. неудобно IMHO. захочешь чего добавить, так вместо простого заключения этого в {} надо несколько строк исходника вправо/влево двигать. дебилизм какой-то ящитаю.
[2:41:19 PM] папаша Дорсет: согласен
[2:41:48 PM] Великий Махатма: вот уж точно write-only language, причём изначально надо всё продумывать что надо, а что нет, чтобы после блоки кода вправо/влево не двигать.
[2:42:26 PM] папаша Дорсет: Так и есть. Кто-то скрипт налабает, и все качают-запускают.
[2:44:55 PM] Великий Махатма: а потому что легче занова написать, чем добавлять/исправлять.
[2:46:07 PM] Великий Махатма: есть же нормальные скриптовые языки (нормальные по сравнению с Python). тот Perl. чего все к этому Питону так неровно дышат? не понимаю.

...


Прочитал этот твой камент и увидел что не мне одному оказывается Питон был и есть неприятен именно из-за того, что "Там же из-за отступов нельзя вот так из одного места программы в другое скопировать текст без последующего выравнивания по месту!" :-)

Edited at 2015-11-04 08:26 (UTC)

Посмотрел на дату создания одного из своих файлов .py, в котором я впервые столкнулся именно с этим, с evergreen постоянством default параметров -- август 2014. До августа 2014 я тоже не знал про такую фичу недоязыка. Но с августа 2014 знаю и помню.

Весело. Это даже круче, чем Фортрановский прикол - все аргументы передаются по ссылке (для передаваемых констант создаются временные переменные), поэтому в отладчике после вызова процедуры можно увидеть, к примеру, что 2=3.

Edited at 2015-11-05 04:45 (UTC)

  • 1