LINUX.ORG.RU

История изменений

Исправление WitcherGeralt, (текущая версия) :

В питоне разница между переменной и ссылкой на нее не всегда очевидна

Дело не в переменных и ссылках, переменная — всего лишь имя, никакой магии тут нет. Просто в питоне есть изменяемые и неизменяемые типы.

а вот с передачей аргумента создалась бы копия переменной

На самом деле нет. Смотри:

In [1]: def f(A, B, C, D): 
   ...:     print(id(A), id(B), id(C), id(D)) 
   ...:     A += 1 
   ...:     print(id(A), id('bar')) 
   ...:

In [2]: a, b, c, d = 1, 2, 1000, 'bar'

In [3]: print(id(a), id(b), id(c), id(d))
9302176 9302208 139775249962960 139775279152880

In [4]: f(a, b, c, d)
9302176 9302208 139775249962960 139775279152880
9302208 139775279152880

Здесь ты можешь видеть как в функцию передаются ровно те объекты, которые ты передал, а никакие не копии. Также ты тут можешь наблюдать кеши.

А __iadd__ (+=) — это вообще фейк.

Исходная версия WitcherGeralt, :

В питоне разница между переменной и ссылкой на нее не всегда очевидна

Дело не в переменных и ссылках, переменная — всего лишь имя, никакой магии тут нет. Просто в питоне есть изменяемые и неизменяемые типы.

а вот с передачей аргумента создалась бы копия переменной

На самом деле нет. Смотри:

In [1]: def f(A, B, C, D): 
   ...:     print(id(A), id(B), id(C), id(D)) 
   ...:     A += 1 
   ...:     print(id(A), id('bar')) 
   ...:

In [2]: a, b, c, d = 1, 2, 1000, 'bar'

In [3]: print(id(a), id(b), id(c), id(d))
9302176 9302208 139775249962960 139775279152880

In [4]: f(a, b, c, d)
9302176 9302208 139775249962960 139775279152880
9302208 139775279152880

Здесь ты можешь видишь как в функцию передаются ровно те объекты, которые ты передал, а никакие не копии. Так же ты тут можешь наблюдать кеши.

А __iadd__ (+=) — это вообще фейк.