1. Python / Говнокод #22120

    −50

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 04 Февраля 2017

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

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

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

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

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