LINUX.ORG.RU

Python,list,сильно не пинать


0

0

Начинаю разбираться с питоном .

class Foo(object):
__x=10
def __setX(self,x):
self.__x=10
def __getX(self):
return self.__x
x=property(__getX,__setX)
def bar(self):
for prop in [self.x]:
prop=123456789

почeму в методе bar не будет присвоено значение property x ?
Оно остается 10

★★★

>>> for i in [1,2,3,4]:
...     print i
...     i = 42
...     print i
... 
1
42
2
42
3
42
4
42

оно меняется, но локально ;)

Pi ★★★★★
()

потомучто в цикле вызывается self.__getX() который возвращает __значение__, а не ссылку на объект.

Если бы __x был бы сложной стуктурой, то у тебя бы все получилось.

zhiltsov
()
Ответ на: комментарий от zhiltsov

> который возвращает __значение__, а не ссылку на объект

В питоне никто значение не возвращает. В питоне все ссылки.

> Если бы __x был бы сложной стуктурой, то у тебя бы все получилось.

Тоже не совсем верно.

anonymous
()

Не меняется из-за того, что int в питоне immutable, т.е. оператор присваивания создает новый объект в памяти и ссылка prop начинает указывать на него.

Более подробнее про ссылки (даже с картинками) всем читать здесь:

http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-l...

anonymous
()
Ответ на: комментарий от kitov

class Foo(object):
	def __init__(self, x):
		self._x = x

	def _get_x(self):
		return self._x
	def _set_x(self, x):
		self._x = x
	x = property(_get_x, _set_x)

def bar(object):
	for name in ['x']:
		setattr(object, name, 1)

foo = Foo(0)
bar(foo)
print foo.x

Но если вам требуется необходимо делать такое, то у вас что-то определенно не так в программе. Пересмотрите логику работы, вероятно цели можно добиться проще и естественнее.

anonymous
()
Ответ на: комментарий от kitov

> как правильно присваивать значения в цикле eлементам,не их копиям , списка ?

индексной переменной.

for i in range(len(a)):
a[i] = 666

Отдельное задание — подумать, чем плох (или не плох?) такой метод.

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

Еще можно так:

for i, elem in enumerate(my_list):
   print elem
   my_list[i] = 1

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