В следующем коде значения по умолчанию в определении класса Container должны создавать новые переменные экземпляра для c1.a и c2.a.
Вместо этого похоже, что c1.a и c2.a ссылаются на одну и ту же переменную.
Создает ли @dataclass переменная класса? Кажется, это не соответствует предполагаемой функциональности, и я не могу найти ничего о переменных класса в документации.
Поэтому я думаю, что это ошибка. Может кто-нибудь объяснить мне, как это исправить? Должен ли я сообщить об этом как об ошибке в трекере Python?
Я знаю, что эта проблема должна быть связана с тем, как Python передает объекты по ссылке и встроенные типы по значению, поскольку b (это просто число с плавающей запятой) показывает ожидаемое/желаемое поведение, тогда как атрибут a (который является определяемым пользователем объектом) является просто ссылка.
Спасибо!
Код:
from dataclasses import dataclass
@dataclass
class VS:
v: float # value
s: float # scale factor
def scaled_value(self):
return self.v*self.s
@dataclass
class Container:
a: VS = VS(1, 1)
b: float = 1
c1 = Container()
c2 = Container()
print(c1)
print(c2)
c1.a.v = -999
c1.b = -999
print(c1)
print(c2)
Выходы:
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=-999, s=1), b=-999)
Container(a=VS(v=-999, s=1), b=1)
Подробнее здесь: https://stackoverflow.com/questions/628 ... e-variable
Ссылка Python dataclasses.dataclass на переменную вместо переменной экземпляра ⇐ Python
Программы на Python
1734556682
Anonymous
В следующем коде значения по умолчанию в определении класса Container должны создавать новые переменные экземпляра для c1.a и c2.a.
Вместо этого похоже, что c1.a и c2.a ссылаются на одну и ту же переменную.
Создает ли @dataclass переменная класса? Кажется, это не соответствует предполагаемой функциональности, и я не могу найти ничего о переменных класса в документации.
Поэтому я думаю, что это ошибка. Может кто-нибудь объяснить мне, как это исправить? Должен ли я сообщить об этом как об ошибке в трекере Python?
Я знаю, что эта проблема должна быть связана с тем, как Python передает объекты по ссылке и встроенные типы по значению, поскольку b (это просто число с плавающей запятой) показывает ожидаемое/желаемое поведение, тогда как атрибут a (который является определяемым пользователем объектом) является просто ссылка.
Спасибо!
Код:
from dataclasses import dataclass
@dataclass
class VS:
v: float # value
s: float # scale factor
def scaled_value(self):
return self.v*self.s
@dataclass
class Container:
a: VS = VS(1, 1)
b: float = 1
c1 = Container()
c2 = Container()
print(c1)
print(c2)
c1.a.v = -999
c1.b = -999
print(c1)
print(c2)
Выходы:
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=-999, s=1), b=-999)
Container(a=VS(v=-999, s=1), b=1)
Подробнее здесь: [url]https://stackoverflow.com/questions/62852942/python-dataclasses-dataclass-reference-to-variable-instead-of-instance-variable[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия