2015-01-14 1 views
1

Неизменного объект с двумя именами, связанными с ней:Instance атрибут переменчивость (очень простой)

xint=1 
yint=xint 
print yint #>>1 
xint=2 
print yint #>>1 - did not change as expected since yint refers to an immutable object 

изменяемый объект с двумя именами, связанными с ней:

xmutable=[1,2,3] 
ymutable=xmutable 
print ymutable #>>[1,2,3] 
xmutable[2]='yo' 
print ymutable #>>[1,2,'yo'] - changed since the list object referred to was mutated, as expected 

Имя привязанных к экземпляр, который мутирует:

class bob: 
    def __init__(self, n): 
     self.n=n 
     self.i=0 

bob1=bob(2) 

i = bob1.i 
print i #>>0 
bob1.i += 1 
print i #>>0 - did not change, not what I expected. 

Итак, и простите меня, если это действительно тупой вопрос, я рассматриваю глобальное имя i как относящееся к атрибуту экземпляра bob1.i (а не базовому целому числу), которое должно быть изменчивым. Я бы ожидал, что аналогично тому, как имя привязано к списку, что если в этом случае мутирует список (или атрибут экземпляра), все связанные с ним имена будут отражать это изменение (например, второй пример).

+0

я не уверен, что вопрос, но 'i' делает _not_ держите ссылку на 'bob1.i', потому что она имеет неизменный тип (int). Объект 'instance attribute' не существует или что-то в этом роде. –

+0

Итак, атрибуты экземпляра - это просто больше имен, которые относятся к фактическим базовым объектам? Значит ли это в основном означает, что имя 'i' является просто ссылкой на другое имя' bob1.i', это ссылка на целое число? Я был под ошибочным впечатлением, что атрибуты экземпляра были объектами, а не просто другим именем. – Solaxun

ответ

0

ints неизменяемы, поэтому i указывает на значение int bob.i, когда вы используете bob.i += 1, который создает новый объект. Если вы использовали изменяемый элемент как список, то значение изменится к г и bob.i, поскольку они все равно оба будут указывать на тот же объект:

class bob: 
    def __init__(self, n): 
     self.n=n 
     self.i=[0] 

bob1=bob(2) 

i = bob1.i 
print i #>>0 
bob1.i[0] += 1 
print(bob1.i) 
print i #>> now both are [1] 

используя свой код, если напечатать идентификаторы вы будете см я всегда указывает на тот же объект, но bob.i указывает на новый объект, который создается с bob.i + = 1:

class bob: 
    def __init__(self, n): 
     self.n=n 
     self.i=0 

bob1=bob(2) 

print(id(i)) 
print(id(bob1.i)) 
bob1.i += 1 
print(id(bob1.i)) 
print(id(i)) 
print(id(1)) 
28426608 
28426608 
28426584 
28426608 
+0

Я подозревал, что 'i' имел в виду целое число, иначе поведение не имело бы смысла. Таким образом, в основном моя ошибка заключалась в том, что bob.i был объектом, когда на самом деле это просто другое имя, связанное с объектами. Поэтому в моем примере «i» - это имя, которое ссылается на «bob.i», это просто другое имя, которое ссылается на целое число. Это верно? – Solaxun

+0

@Solaxun, да, способ немного обмануть - попробуйте распечатать 'print (id (1))', python кэширует некоторые небольшие ints, чтобы вы могли видеть, что действительно id для объекта int. –

 Смежные вопросы

  • Нет связанных вопросов^_^