Указатели в Python


В явном виде указатели не встречаются, однако, с ними приходится иметь дело.

a = 10
b = a
b += 20
print (a,b)

На экране 10, 30


a = [10]
b = a
b += [20]
print (a,b)

На экране [10,20], [10,20].
Как ни странно, но список а также изменился, несмотря на то, что мы его, вроде бы, не изменяли.
Для чисел, строк и переменных True/False работает первый вариант, для всех остальных – второй.
При копировании объектов (т.е. все, кроме строк, чисел и True/False) происходит не копирование значения, а создание нового имени для того же объекта!

a = [10,20]
def test (a):
    a += ['!']
    return a

print (a)
print (test(a))
print (a)

На экране:
[10, 20]
[10, 20, ‘!’]
[10, 20, ‘!’]
Т.е. изменения списка а сохранились после завершения работы функции.
Если нужно передать копию списка, тогда так:

a = [10,20]
def test (a):
    a += ['!']
    return a

print (a)
print (test(a[:]))
print (a)

Как следствие вышесказанного:

a = [rnd(10) for x in range(12)]
for x in a:
    x += 1

не повлияет на список a, т.к. изменения коснуться лишь копий элементов.

В тоже время, аналогичный код для объектов приведет к ожидаемому результату:

class ball():
	def __init__(self):
		self.x = 10
		self.y = 20

a = [ball() for x in range(12)]
for b in a:
	print(b.x, end = ' ')
print()

for b in a:
	b.x += 10

for b in a:
	print(b.x, end = ' ')
print()

Весь секрет в передаче значения элемента или ссылки на элемент.
Если сомневаетесь, то используйте функцию id() для проверки:

a = 10
print(id(a))
b = a
print(id(b))

Разные id — разные переменные.

class test():
    n = 10
a = test()
print(id(a))
b = a
print(id(b))

Одинаковые id — значит это разные имена для одного и того же объекта.

One thought on “Указатели в Python

  1. Уведомление: Аноним

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *