Функ (Структура)
////
КонецФункции
в 1с в качестве аргумента функции передается адрес переменной?
а в Python передается в качестве аргумента адрес объекта на которую ссылается переменная?
Т. е. в вызываемой функции в 1с полученная переменная - это та же самая переменная (имеет тот же адрес памяти), что и в вызывающей функции,
А в Python - это другая переменная (имеет другой адрес памяти), но ссылаются на один и тот же объект.
Чет не могу техническую документацию найти.
Поведение отличается
Python
арументы (изменяемых объектов) функций в 1с и Python
не скажу за 1С, но для python - все правильно
любой кусок данных, функция, тип, и все-все что можно присвоить переменной (т. е. почти все в языке, кроме, разве что ключевых слов) - это объект, экземпляр какого-нибудь класса.
сама переменная - это ссылка на этот объект. так же в роли ссылки может выступать элемент контейнера: ячейка списка, элемент множества, ключ или значение словаря, и т. д.
a = 1
b = [a]
c = {a}
d = {a:a}
во всех случаях в контейнерах будет храниться ровно тот же объект, что и в a
сама ссылка в рамках языка объектом не является, и присваивание одной ссылке значения другой перенаправляет первую на новый объект никак не затрагивая предыдущий объект на который она ссылалась.
в предыдущем примере если изменить значение a = 2, то b[0] все так же будет ссылаться на объект 1, потому, что там ссылка не была переназначена
если в c++, можно сделать так
int x = 1;
int &z = x;
z = 2;
cout << x << endl; // 2
и z, как и x будут ссылаться на новый объект 2.
в python присваивание оператором не является, и никак не контролируется программой. поэтому с помощью присваивания невозможно повлиять на содержимое объекта.
исключением можно было бы назвать подобные конструкции
a[x] = y
x += y
a[x] += y
но это не совсем присваивания. они на самом деле транслируются в следующие вызовы
a.__setitem__(x, y)
x = x.__iadd__(y)
a,__setitem__(x, a.__getitem__(x).__iadd__(y))
если объект не поддерживает присваивание со сложением, то на месте __iadd__ будут __add__, иначе __iadd__ на самом деле способен изменять содержимое своего объекта, если это прописано в его коде.
например
a = [1,2]
b = a
b += [3,4]
print(a) # [1, 2, 3, 4]
но для большинства классов в python такой функционал не реализован - однажды созданный объект в последствии изменить невозможно.
любой кусок данных, функция, тип, и все-все что можно присвоить переменной (т. е. почти все в языке, кроме, разве что ключевых слов) - это объект, экземпляр какого-нибудь класса.
сама переменная - это ссылка на этот объект. так же в роли ссылки может выступать элемент контейнера: ячейка списка, элемент множества, ключ или значение словаря, и т. д.
a = 1
b = [a]
c = {a}
d = {a:a}
во всех случаях в контейнерах будет храниться ровно тот же объект, что и в a
сама ссылка в рамках языка объектом не является, и присваивание одной ссылке значения другой перенаправляет первую на новый объект никак не затрагивая предыдущий объект на который она ссылалась.
в предыдущем примере если изменить значение a = 2, то b[0] все так же будет ссылаться на объект 1, потому, что там ссылка не была переназначена
если в c++, можно сделать так
int x = 1;
int &z = x;
z = 2;
cout << x << endl; // 2
и z, как и x будут ссылаться на новый объект 2.
в python присваивание оператором не является, и никак не контролируется программой. поэтому с помощью присваивания невозможно повлиять на содержимое объекта.
исключением можно было бы назвать подобные конструкции
a[x] = y
x += y
a[x] += y
но это не совсем присваивания. они на самом деле транслируются в следующие вызовы
a.__setitem__(x, y)
x = x.__iadd__(y)
a,__setitem__(x, a.__getitem__(x).__iadd__(y))
если объект не поддерживает присваивание со сложением, то на месте __iadd__ будут __add__, иначе __iadd__ на самом деле способен изменять содержимое своего объекта, если это прописано в его коде.
например
a = [1,2]
b = a
b += [3,4]
print(a) # [1, 2, 3, 4]
но для большинства классов в python такой функционал не реализован - однажды созданный объект в последствии изменить невозможно.
вот советую хороший сайт vdgb.ru/katalog-1s
Валерий Черников
ховно твой сайт и фирма которую рекламируешь тоже
Похожие вопросы
- Параметры функций python (я чайник)
- Python.Какой функцией можно вывести КОЛИЧЕСТВО четных элементов в массиве?
- Функции в Python, как понять?
- Python не выводит результат функции
- Я не понимаю как сделать Эту функцию по Python! Не понятно!
- Окончил курсы на степике по Python что делать дальше?
- Python программирование. Помогите написать программу.
- Нейронные сети на Python 3.4
- Как сделать физику падения объектам на python ?
- В Python все функции вызываются с контекстом, не как inline (встроенные)?
а = [1,2]
a.append(3)
Поменяли ведь объект?
В 1с тоже самое происходит в момент присваивания не простых типов:
а = Новый Массив ();
б = а;
б [0] = 1;
переменная а также будет ссылаться на тот же массив измененный (а [0]=1)
если а = Новый Массив ();,то это будут разные массивы, но если сделать так:
///////////////////
а = Новый Массив [1]; //а [0]=1
б = а; //б [0]=1
Функ1(а); //а [0]=5 //б [0]=1 //в Питоне останется а [0] =1
/////////////////////////////
Функ1(х)
х = Новый Массив [5];
КонецФункции
////////////////////
Только начал изучать Питон. Там код всегда открытый? или его можно зашифровать в коммерческих целях?