Python: список объектов против поведения целых чисел - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в языке и немного запутался в ссылках на Python.

Рассмотрим этот код:

class A:
  def __init__(self, x):
    self.x = x

a = A(3)
v=[a]
print(f'obj before: v[0].x={v[0].x}')
a.x = a.x + 1
print(f'obj after:  v[0].x={v[0].x}')

b = 3
w=[b]
print(f'int before: w[0]={w[0]}')
b = b + 1
print(f'int after:  w[0]={w[0]}')

===================== выход:

obj before: v[0].x=3
obj after:  v[0].x=4
int before: w[0]=3
int after:  w[0]=3

Почему версии кода obj и int работают по-разному?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

a = A (3)

Переменная a указывает на объект.

v = [а]

Первый элемент v указывает на тот же объект.

a.x = a.x + 1

Изменить атрибут "x" объекта.

v все еще содержит тот же объект, но его атрибут изменился.

b = 3

Переменная b указывает на объект 3.

ш = [Ь] * * тысяча двадцать-восемь

Первый элемент w также указывает на объект 3.

b = b + 1

b теперь указывает на то, что вы получаете, когда выполняете сложение для объекта 3 и объекта 1, который является объектом 4.

w по-прежнему содержит объект 3. Вы никогда не меняли никаких атрибутов этого объекта и никогда не меняли место, на которое указывает первый элемент w.

0 голосов
/ 02 сентября 2018

Когда вы делаете это, вы модифицируете объект a:

a.x = a.x + 1

Когда вы делаете это, вы меняете, к какой переменной относится b:

b = b + 1

Другими словами, существует большая разница между b и x в приведенном выше коде: b является переменной, а x является атрибутом a.

Присвоение чего-либо переменной не приводит к изменению каких-либо объектов, и, следовательно, влияет только на переменную, которой было присвоено *, тогда как установка значения атрибута изменяет объект, который можно увидеть в любая переменная, которая ссылается на этот объект.


* Есть также изменения в подсчетах, влияющие на сборщик мусора, но это не актуально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...