Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2013 16:19:42

Euler
Зарегистрирован: 2013-07-30
Сообщения: 43
Репутация: +  1  -
Профиль   Отправить e-mail  

Создание объектов

Собственно код:

class TEST():
	def __init__(self):
		self.s += str(len(self.s))		#к строке дописываем её длину
		self.arr.append(len(self.arr))	#в список добавляем элемент с его длиной
		
	def __str__(self):
		return "s = " + self.s + "\tarr = " + str(self.arr)
	
	s = ""
	arr = []
	
print(TEST())
print(TEST())
На выходе получаю:
s = 0   arr = [0]
s = 0 arr = [0, 1]
Совершенно не понимаю поведение транслятора - со строкой всё правильно, новый экземпляр и новая строка, но почему список один и тот же в двух экземплярах?

Офлайн

#2 Сен. 16, 2013 16:30:22

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Создание объектов

строка иммутабельна, += - создает новую строку
список нет, .append добавляет элемент в существующий

Офлайн

#3 Сен. 16, 2013 16:34:03

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Создание объектов

наверное хотите так

class TEST():
    def __init__(self):
        self.s = ""
        self.arr = []
        self.s += str(len(self.s))		#к строке дописываем её длину
        self.arr.append(len(self.arr))	#в список добавляем элемент с его длиной
		
    def __str__(self):
        return "s = " + self.s + "\tarr = " + str(self.arr)
	
	
print(TEST())
print(TEST())

Офлайн

#4 Сен. 16, 2013 16:34:37

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Создание объектов

Вообще товарищ sergeek прав, но
Посмотрите внимательно на понятия переменной экземпляра класса и переменной объекта класса,ну это так, на тот случай что бы помнили разницу.

class Test(object):
    l=[]
class Test2(object):
    def __init__(self):
        self.l=[]

sergeek немного опередил с мыслью=)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Сен. 16, 2013 16:35:27)

Офлайн

#5 Сен. 16, 2013 16:53:16

Euler
Зарегистрирован: 2013-07-30
Сообщения: 43
Репутация: +  1  -
Профиль   Отправить e-mail  

Создание объектов

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

Офлайн

#6 Сен. 16, 2013 19:59:14

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Создание объектов

Описание поведения можно найти тут, но сам я его не читал. Мне как-то проще было вывести эту семантику посредством эксперементирования с атрибутами.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version