Ответ 1
В принципе, b = a
указывает b
туда, где a
указывает, и ничего больше.
То, о чем вы спрашиваете, является изменяемым типом. Числа, строки, кортежи, фризонеты, булевы, None
, неизменяемы. Списки, словари, наборы, bytearrays, являются изменяемыми.
Если я создаю изменяемый тип, например list
:
>>> a = [1, 2] # create an object in memory that points to 1 and 2, and point a at it
>>> b = a # point b to wherever a points
>>> a[0] = 2 # change the object that a points to by pointing its first item at 2
>>> a
[2, 2]
>>> b
[2, 2]
Они оба будут указывать на один и тот же элемент.
Я также прокомментирую ваш исходный код:
>>>a=5 # '5' is interned, so it already exists, point a at it in memory
>>>b=a # point b to wherever a points
>>>a=6 # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
Вы всегда можете видеть, где что-то указывает на память, делая id(something)
.
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368 # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368 # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356 # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368 # still pointing at 5.
>>> b
5
Вы используете copy
, когда хотите сделать копию структуры. Тем не менее, не сделает копию интернированного. Это включает в себя целые числа меньше 256
, True
, False
, None
, короткие строки, такие как a
. В принципе, вы должны почти никогда не использовать его, если не уверены, что не будете запутаны в процессе интернирования.
Рассмотрим еще один пример, который показывает даже с изменяемыми типами, указывая одну переменную на что-то новое, но не меняет старую переменную:
>>> a = [1, 2]
>>> b = a
>>> a = a[:1] # copy the list a points to, starting with item 2, and point a at it
>>> b # b still points to the original list
[1, 2]
>>> a
[1]
>>> id(b)
79367984
>>> id(a)
80533904
Нарезка списка (всякий раз, когда вы используете :
) делает копию.