LINUX.ORG.RU

Как правильно передать параметры по умолчанию в __init__?

 


0

1
class A(object):
    def __init__(self, opt='qwert'):
        self.opt=opt

a=A()
b=A()

In [9]: a is b
Out[9]: False

In [10]: a.opt is b.opt
Out[10]: True

In [11]: a.opt='trewq'

In [15]: a.opt is b.opt
Out[15]: False

Мне такого не надо. Мне надо чтоб a.opt и b.opt всегда были разными объектами.

★★☆

Ответ на: комментарий от true_admin

Ступил. У меня вобще opt это словарь с опциями, а у него есть свой copy.

yvv ★★☆
() автор топика
Ответ на: комментарий от anonymous

ещё какой костыль. Просто пистон весь из костылей состоит, поэтому copy не так заметен на общем фоне.

anonymous
()

Для mutable есть еще обходной путь:

class A(object):
    def __init__(self, opt=None):
        self.opt = 'default' if opt is None else opt
Belkrr
()

Небольшие числа в питоне кешируются, ну и строки, тоже.

Строки (как и числа) в питоне — неизменяемые объекты, поэтому изменение одной строки не приведёт к изменению другой.

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> i1 = 10
>>> i2 = 10
>>> id(i1) == id(i2)
True
>>> id(i1), id(i2)
(11163360, 11163360)
>>> i2 = 11
>>> id(i1) == id(i2)
False
>>> id(i1), id(i2)
(11163360, 11163336)
>>> i1, i2
(10, 11)
>>> 
>>> 
>>> 
>>> s1 = "qwerty"
>>> s2 = "qwerty"
>>> id(s1) == id(s2)
True
>>> id(s1), id(s2)
(140412503943856, 140412503943856)
>>> s2 = "lol"
>>> id(s1) == id(s2)
False
>>> id(s1), id(s2)
(140412503943856, 140412503926904)
>>> s1, s2
('qwerty', 'lol')
>>> 
theanonymous
()
Ответ на: комментарий от theanonymous

Гхм, на лоре нельзя редактировать свои же сообщения О_о..

Строки (как и числа) в питоне — неизменяемые объекты,
поэтому изменение одной строки не приведёт к изменению
другой.

Естественно, это очень упрощённо.

А, вообще, ТС надо почитать любую книгу по питону, там будет разжёвано, что имя переменной в питоне это ссылка на область памяти где хранится необходимое значение и изменение значения для имени переменной приводит только к изменению ссылки на область памяти.

theanonymous
()

Объект 'qwert' создается один раз при создании функции (или при первом вызове, точно не скажу), а не при каждом ее вызове. Для этого есть следующая идиома.

def foo(param=None):
    if param is None:
        param = 'default'

    ...
urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Еще бывает, что None также возможное значение аргумента, тогда есть такая идиома:

_undefined = object()

def foo(params=_undefined):
    if params is _undefined:
        params = {'bar': 'baz'}
    print params

foo()
# {'bar': 'baz'}
foo({'bar': 'bazzz'})
# {'bar': 'bazzz'}
foo(None)
# None
anti_social
()
Ответ на: комментарий от anti_social

Ужоснах. Открой для себя **kwargs.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.