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