Грабельки, грабельки…
Делай раз:

Делай два:

Я догадывался, что Германия – это не город. Но если уж вы сами туда кроме городов иногда подставляете страны, так, наверное, и проверять в списке стран тоже надо?
Оригинал этой записи в личном блоге.
Делай раз:

Делай два:

Я догадывался, что Германия – это не город. Но если уж вы сами туда кроме городов иногда подставляете страны, так, наверное, и проверять в списке стран тоже надо?
Оригинал этой записи в личном блоге.
no subject
no subject
если в функцию передаётся копия фактического параметра, и изменение его внутри функции не приводит к изменению самого фактического параметра - это передача по значению, если передаётся ссылка на фактический параметр и его можно изменить внутри функции - это передача по ссылке.
no subject
Ok, если объекты иммутабельны — то есть разница или нет? А если нет копий?
no subject
вопрос, конечно, о том случае, когда объект изменяемый
no subject
no subject
no subject
no subject
no subject
no subject
по ссылке:
f(int& x) { x = 5 };
a = 1;
f(a);
// a == 5
в питоне (refs by value)
def f(x):
x = 5
a = 1
f(a)
// a == 1
no subject
def f(x,a):
a.append(x)
b=[]
# b = []
f('foo',b)
# b = ['foo']
из чего следует, что список передаётся по ссылке
no subject
no subject
no subject
no subject
а в питоне их отдельно вроде нет.
no subject
def f(l):
l = [1]
a = []
f(a)
// a == []
ссылка на список передается по значению.
no subject
no subject
no subject
no subject
no subject
no subject
f(int* x) { x = new int(5); }
a = new int(1);
f(a);
// *a == int(1)
f(list* l) { l = new list(new int(1)); } // заменяем указатель, значение не меняется
a = new list();
f(a);
// *a == list()
f(list* l) { l->append(new int(1)); } // используем указатель, чтобы поменять значение
a = new list();
f(a);
// *a == list(1)
no subject
Ну да. И всё. Разыменовать нельзя (что бы bit-to-bit Скопировать объект), арифметика адресная не работает…
В общем, я же говорю — это терминологический спор. Для меня это передача ОБЪЕКТА по ссылке потому что УКАЗАТЕЛЬ в питоне собственной ценности не имеет вовсе, а передача ОБЪЕКТА по значению невозможна вовсе.
no subject
назвать можно хоть горшком, факт в том, что в питоне нельзя поменять binding внешней переменной, что является одним из основных назначений call by ref в некоторых языках. т.е. если из функции нужно вернуть несколько значений, с call by ref это делается так:
function foo(arg: type, OUT res2: res2_type): res1_type;
(или res1_type foo(type arg, out res2_type res2);)
res1 = foo(x, res2); // в res2 попадает второй результат
в питоне _так_ сделать нельзя. можно сделать похоже:
additional_results = []
res = foo(x, additional_results) // foo делала append результатов в список
разница, конечно, очень тонкая, но важная.
no subject
Как у ссылки (то, что можно переприсвоить — НЕ как у ссылки)
скопировать можно (import copy)
Это клонирование ведь будет, не тупое копирование? Или нет?
да и вообще, почему над указателем должны работать операции из С?
Ну, потому что УКАЗАТЕЛЬ — это по определению адрес в памяти :) А во всяких C#, Python, PErk, JAva & Ko нет УКАЗАТЕЛЕЙ а есть ССЫЛКИ. Которые можно обычно переприсваивать (в отличие от ссылок в C++).
назвать можно хоть горшком, факт в том, что в питоне нельзя поменять binding внешней переменной, что является одним из основных назначений call by ref в некоторых языках
Вообще, я же говорю — тут путаница и каша. Да в той же википедии почитать — они путают в одном текстк call by ref и что-то ещё (читал пару месяцев назад этот бред, уже не помню).
Ещё раз: ОБЪЕКТЫ передаются в питоне ПО ССЫЛКЕ. ССЫЛКА — по значеню, да.
no subject
да вообще call by -- ущербная терминология. правильнее сказать, что в питоне reference semantics, так имхо понятнее. но ссылки тоже можно передавать по ссылке, см. ref/out в C# :-)
no subject
Да-да, я ка краз хотел сказать что если res_type2 — объектный, то мы получим двойную ссылку по сути :)
no subject
no subject
However, the term "call by sharing" is not in common use; the terminology is inconsistent across different sources. For example, in the Java community, they say that Java is pass-by-value, whereas in the Ruby community, they say that Ruby is pass-by-reference, even though the two languages exhibit the same semantics.
no subject
no subject
no subject
я, кажется, понял. формальный параметр изначально показывает на тот же объект, что и фактический, но в отличие от других языков, его можно переназначить на другой объект. в частности, прямым присваиванием.
no subject
no subject
no subject
так понятнее?
no subject
no subject
no subject