Скопировал ли я экземпляр класса или обработчик класса сюда?

#python #class #handler

#python #класс #обработчик

Вопрос:

Я хочу отсортировать обработчики классов по свойствам класса. Сначала я генерирую список обработчиков класса, следующие 5 строк обрабатываются в цикле while.

 # here a serial no was entered and validity checked
if snr_ok == True:
    device_list.append(Device(snr, prop_list))
    logging.info ("Added serial number "   snr   " with properties "   prop_list)
else: 
    pass
    
    """Group all instances of by property (which is a gas type)"""    
    calibration_gases = {'He':[], 'O2':[], 'N':[], 'Ar':[]}                    
    for gas in list(calibration_gases):
        for dev in device_list:
            if gas in dev.get_gaslist(): # get_gaslist returns a list of strings with some of the gases
                calibration_gases[gas].**append(dev)**
    print (calibration_gases)
  

Группируя dev элементы по типу gas, я добавляю их в calibration_gases dict.
Мой вопрос:
Является ли dev копией экземпляра класса или это копия обработчика класса?
Или, говоря на C: Является ли dev указателем на экземпляр класса или это копия самого класса?

Комментарии:

1. Вам следует прочитать следующее: nedbatchelder.com/text/names.html

Ответ №1:

Ни то, ни другое. В Python нет различия между вызовом по значению и вызовом по ссылке, вместо этого используется парадигма вызова по идентификатору объекта. Если вы явно что-то не копируете (например, используя нарезку, obj.copy() или copy.deepcopy ), этого не происходит.

В calibration_gases[gas] добавляется тот же объект, который можно найти в device_list .

Кстати, вместо for gas in list(calibration_gases): вы могли бы просто сделать for gas in calibration_gases: . Еще лучше, вы могли бы сделать:

 for gas, devices in calibration_gases.items():
    for dev in device_list:
        if gas in dev.get_gaslist():
            devices.append(dev)
  

Комментарии:

1. спасибо за объяснение, это то, на что я надеялся