#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. спасибо за объяснение, это то, на что я надеялся