Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Указатели в питоне


Автор: tofreesky 28.7.2013, 20:15
Код

ListOfObjects = []

for x in xrange(5):
    cObject = fnc('')
    cObject.ListOfSmt.append(1)

    ListOfObjects.append(cObject)


Почему при каждой итерации заполняется ListOfSmt лишь первого объекта, ведь тут же я использую указатель на каждый новый объект, так что в каждом объекте должен быть уникальный одинарный список из одного элемента? Но это не так.

Автор: tofreesky 31.7.2013, 20:22
Что никто не знает?

Автор: tofreesky 1.8.2013, 16:37
up

Автор: SenkraD 2.8.2013, 12:10
а можно пояснить что вы хотите? также было б неплохо сделать минимально-рабочий пример кода, а то я по вашему коду ничего понять не могу

Автор: tishaishii 7.8.2013, 20:10
А что такое "fnc('')"?

Автор: Bodyan 7.8.2013, 21:55
Цитата(tofreesky @ 28.7.2013,  20:15)
Код

ListOfObjects = []

for x in xrange(5):
    cObject = fnc('')
    cObjecct.ListOfSmt.append(1)

    ListOfObjects.append(cObject)


Почему при каждой итерации заполняется ListOfSmt лишь первого объекта, ведь тут же я использую указатель на каждый новый объект, так что в каждом объекте должен быть уникальный одинарный список из одного элемента? Но это не так.

Потому, что Вы указали заполнять только первый [].

Автор: SenkraD 8.8.2013, 18:22
да не, там просто код бредовый или не полный так, как в 4-й и 5-й строчках он работает с разными обьектами. если сделать код вменяемым (применив немного телепатии), то все работае как, наверное,  и ожидалось:
Код

import sys

class Object:
    def __init__(self, name):
        self.name = name
        self.listOfSomething = []
        
    def __repr__(self):
        return "{name=%s, list=%s}\\r\n" % (self.name, str(self.listOfSomething))

def createObject(name):
    return Object(name)

if __name__ == "__main__":
    listOfObjects = []
    
    for objectId in xrange(5):
        testObject = createObject("test-object-" + str(objectId))
        testObject.listOfSomething.append(objectId)
        
        listOfObjects.append(testObject)
    
    print listOfObjects
    sys.exit(0)

То будет видно что заполняются списки у всех обьектов
Код
[{name=test-object-0, list=[0]}
, {name=test-object-1, list=[1]}
, {name=test-object-2, list=[2]}
, {name=test-object-3, list=[3]}
, {name=test-object-4, list=[4]}
]

Если добавить еще телепатии и убрать опечатку в форе, то там наверное косяк в реализации класса

Автор: tofreesky 16.8.2013, 23:27
Цитата

как в 4-й и 5-й строчках он работает с разными обьектами.


Почему с разными? На 4 строке создал новый объект, на 5 использую его же, а получается что используется всегда самый первый созданный объект, почему?

Автор: SenkraD 18.8.2013, 14:53
Цитата(tofreesky @  16.8.2013,  23:27 Найти цитируемый пост)
Почему с разными? На 4 строке создал новый объект, на 5 использую его же, а получается что используется всегда самый первый созданный объект, почему?
cObject и cObjecct - это одно и тоже? две буквы 'c' в названии переменной в пятой строчке не смущают?

Автор: tofreesky 18.8.2013, 15:08
Цитата(SenkraD @ 18.8.2013,  14:53)
Цитата(tofreesky @  16.8.2013,  23:27 Найти цитируемый пост)
Почему с разными? На 4 строке создал новый объект, на 5 использую его же, а получается что используется всегда самый первый созданный объект, почему?
cObject и cObjecct - это одно и тоже? две буквы 'c' в названии переменной в пятой строчке не смущают?

Это опечатка, дело не в этом.

Добавлено через 3 минуты и 32 секунды
Код

class fnc(object):
    def __init__(self, name):
        self.FunctionName = name
    ListOfSmt = []

ListOfObjects = []
for x in xrange(5):
    cObject = fnc('')
    cObject.ListOfSmt.append(1)
    ListOfObjects.append(cObject)

for x in xrange(5):
    print id(ListOfObjects[x].ListOfSmt)

exit()


Вывод:

Код

46243528
46243528
46243528
46243528
46243528

Автор: vvms 19.8.2013, 03:44
Код

class fnc(object):
    def __init__(self, name):
        self.FunctionName = name
    ListOfSmt = []


И правильно оно тут выводит. В данном случае ListOfSmt - это class-member, а не object-member. Другими словами, все экземпляры класса обращаются к одному и тому же ListOfSmt. Надо правильно его инициализировать через self, чтобы у каждого объекта был свой список.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)