- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 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!'}
Утащил по словарь по ссылке, изменил, а потом удивляешься что оно изменилось?
И да, по-умолчанию передавать коллекции по значению - не очень умно. Ведь придётся делать копию, а откуда ты знаешь, какой у них размер? А если функция не изменяет аргумент, то вообще без разницы.
Поэтому проще передавать по ссылке. Просто надо документировать, если объект может быть изменен внутри функции. А то, блин, сделают неявную зависимость от глобальной переменной, а потом удивляются.
Единственное, где такой подход работает плохо - параметры по умолчанию. У них хранится только один экземпляр значения, и если его изменить - он изменится и для последующих вызовов функции. Это неудобно, да. Нужно явно копировать в таких случаях.
ФЗ, может решили что это дорогое удовольствие?
то есть указатели все равно есть, просто называются ссылками и никак не выделяются синтаксически. И чтобы не запутаться, приходится об этом помнить.
Я хочу два типа сущностей - "объект" и "значение". Почему-то в С++ (если использую, скажем, Qt) я могу передать массив или словарь, не заботясь, что кто-то его может поменять. А в таком высокоуровневом Питоне или Сишарпе мне придется беспокоиться, вдруг кто что изменит, клонировать на всякий случай, что ли?