В явном виде указатели не встречаются, однако, с ними приходится иметь дело.
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”