Змея / Говнокод #22120 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
bbb = {'name':'Sergey'}
class Race:
    aaa =  {'type' : 'Bubenchik'}
    bbb = False

    def __init__(self, type, name):
        self.aaa['type'] = type
        self.bbb = bbb

    def __str__(self):
        return "{} - {}, ".format(self.aaa['type'], self.bbb['name'])

if name == "__main__":
    orc = Race('orc','Traal')

    print(orc)

    troll = Race('troll','Vasya')
    troll.bbb['name'] = 'Ya skazal VASYA!'

    print(troll)
    print(orc)
    print(bbb)

----------------------------------------

orc - Sergey, 
troll - Ya skazal VASYA!, 
troll - Ya skazal VASYA!, 
{'name': 'Ya skazal VASYA!'}

trOll vasya

Запостил: Aypee Aypee, (Updated )

Комментарии (8) RSS

    • Ну и в чём вопрос-то?
      Утащил по словарь по ссылке, изменил, а потом удивляешься что оно изменилось?
      Ответить
      • Ну да, конечно, ведь словари и массивы нужно по умолчанию передавать по ссылке, чтобы функция могла их изменить. Ведь это основной способ их использования. Зато нет указателей, ведь указатели - это сложно.
        Ответить
        • Нет ручного управления памятью. Это не то же самое, что нет указателей.
          И да, по-умолчанию передавать коллекции по значению - не очень умно. Ведь придётся делать копию, а откуда ты знаешь, какой у них размер? А если функция не изменяет аргумент, то вообще без разницы.
          Поэтому проще передавать по ссылке. Просто надо документировать, если объект может быть изменен внутри функции. А то, блин, сделают неявную зависимость от глобальной переменной, а потом удивляются.

          Единственное, где такой подход работает плохо - параметры по умолчанию. У них хранится только один экземпляр значения, и если его изменить - он изменится и для последующих вызовов функции. Это неудобно, да. Нужно явно копировать в таких случаях.
          Ответить
          • По-хорошему, параметр по умолчанию должнем быть иммутабельным, не?
            Ответить
            • Не иммутабельным, а конструироваться новая копия при каждом вызове.
              ФЗ, может решили что это дорогое удовольствие?
              Ответить
          • >>нет указателей, ведь указатели - это сложно
            то есть указатели все равно есть, просто называются ссылками и никак не выделяются синтаксически. И чтобы не запутаться, приходится об этом помнить.

            Я хочу два типа сущностей - "объект" и "значение". Почему-то в С++ (если использую, скажем, Qt) я могу передать массив или словарь, не заботясь, что кто-то его может поменять. А в таком высокоуровневом Питоне или Сишарпе мне придется беспокоиться, вдруг кто что изменит, клонировать на всякий случай, что ли?
            Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8