- Как приравнять массивы друг другу? Не используя звёздочки.
- Python-сообщество
- #1 Янв. 12, 2023 19:30:01
- Как в переменной приравнять значение массиву?
- #2 Янв. 12, 2023 19:47:27
- Как в переменной приравнять значение массиву?
- #3 Янв. 12, 2023 22:43:44
- Как в переменной приравнять значение массиву?
- КАК ПРИРАВНЯТЬ МАССИВЫ PYTHON
Как приравнять массивы друг другу? Не используя звёздочки.
Например переменные друг другу можно приравнять так: int a=b;
С массивами так же не получается. int arr[10]; int massiv[10]; arr=massiv; Так не получается.
Нужно не сохранить адрес массива в указателе,
Вот так:
int arr[]=;
int *ukazatel = arr;
Это не надо.
Нужно если возможно обойтись без указателей (звёздочек).
Я спрашиваю, потому что у меня нечто подобное получилось, только я не понял как.
Получилось передать в функцию массив и загрузить этот массив в пустой массив функции.
Так:
void func(int massiv[]/*Загружаю в указатель в пустой массив. */ )< >
int main() int arr[]=;;
func(arr); // Передаю arr указатель на массив в функцию.
return 0;
>
Можно подобное сделать не используя функций. По простому, примерно так же как переменные друг другу присваивают?
Приравнивать элементы массива по отдельности друг другу тоже не надо. Это мне понятно как делать.
int arr[]=;
int massiv[]=;
arr[1]=massiv[2];
Массив это не одно число, это потенциально большая структура данных. Там может храниться множество элементов, десятки, сотни, тысячи. Нужно понимать, что с точки зрения памяти ты пытаешься скопировать массив целиком. Он будет в памяти присутствовать дважды. Поэтому без копирования массива здесь не обойтись, что может быть затратным. При указателе, что логично, это уже будет не копия, а тот же массив в памяти.
Мой интерес пока что не в затратности памяти, а в изучении.
А задание под такое действие придумать можно. Когда нужна именно 2 одинаковых массива. А не ссылка на один массив.
Простого решения я не нашёл. Предлагают только поэлементно копировать массив циклом.
Максим Искусственный Интеллект (184837) kh fjkg, для этого массив копируется. В C++ должны быть готовые инструменты для копирования, как во многих языках это можно сделать в одну строчку. Тут ещё пишут, что std::array может копировать массивы при присваивании, но я не в курсе. https://stackoverflow.com/questions/16137953/is-there-a-function-to-copy-an-array-in-c-c/16137979
Максим Искусственный Интеллект (184837) kh fjkg, а, да, я забыл, что тут про С речь. Но копировать массив придется так или иначе.
Максим Искусственный Интеллект (184837) kh fjkg, как минимум это может быть один метод, который потом можно использовать повсеместно.
Имеете в виду приравнивать каждый элемент массива по отдельности друг другу? Забыл про это написать. Но такое тоже не надо.
Какую ересь ты несёшь. Как можно ПРИРАВНЯТЬ массивы как и переменные? Их ИНИЦИАЛИЗИРУЮТ, то есть переменная получает ЗНАЧЕНИЕ правосторонней переменной
А через указатели ты получаешь возможность использовать массив уже созданный и корректировать его значения можно через два указателя, который ссылается на одну область памяти, а не его копию. Через цикл поэлементно можно создать такой же массив, то есть копию в другой области памяти
А я думал почему только справа налево оно работает. Ок. Вообще то я так и думал. Просто пока выражаюсь плохо. Вторую неделю учу Си.
А по вопросу можете ответить?
Батаев Дмитрий Просветленный (21598) kh fjkg, а что не понятного. int first[5]= ; int second[5]= ; если second= first, то это УТЕЧКА памяти в общем-то. Теряется занятая область памяти (((
Через цикл, это опять же надо каждый элемент массива друг другу присваивать. Я в сообщении привёл пример как я разом передал весь массив без цикла.
Батаев Дмитрий Просветленный (21598) kh fjkg, сделай его ГЛОБАЛЬНЫМ. Тогда функции не нужно передавать то, что она увидит по-любому
Дело не в конкретном примере. Дело в том что мне надо сделать то что я описал в вопросе. Для обучения.
Я так понял вы описали пример с утечкой памяти и ошибкой. Мне надо без ошибок.
Один из таких примеров я описал в своём вопросе. Я передал массив другому массиву через функцию.
Да, передал я указатель, это правда, но без звёздочек, что мне и нужно было. Можно такое же сделать без функции?
Батаев Дмитрий Просветленный (21598) kh fjkg, void func(int arr[]) < for (int n=0; n<5;n++) printf("%d\t",arr[n]); >int main () int first[5]= ; func(first); return1; >
Вы напечатали копию моего кода. Я имел в виду без функции надо обойтись и присвоить левому массиву правый массив.
Батаев Дмитрий Просветленный (21598) kh fjkg, ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных — НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
Пока что никуда передавать не надо. Нужно сначала разобраться как левому массиву присвоить значение правого.
Батаев Дмитрий Просветленный (21598) kh fjkg, ПОЭЛЕМЕНТНО. Такими косяками с указателями грешать модные языки пронраммирования. А потом начинается забивание памяти в гаджетах непонятной хренью, да?
Примерно понимаю. В одном массиве было миллион символов, в другом 1. Это разная выделенная память. Но у меня ведь как то получилось.
Батаев Дмитрий Просветленный (21598) kh fjkg, главное слово как-то. Там где был массив int MIL[10000000]; указатель переписал на int ONE[1]; и про мегабайт можно забыть до перезагрузки устройства в лучшем случае
В данном случае будет не использовано лишнее пространство в массиве massiv?
Указатель arr присваивается указателю massiv.
Или теперь arr не использовано и забыто?
void func(int massiv[] ) < >
int main() int arr[]= < 1,2,3,4,5 >;;
func(arr);
return 0;
>
Батаев Дмитрий Просветленный (21598) В ФУНКЦИЮ ПЕРЕДАЁТСЯ ТОЛЬКО АДРЕС МАССИВА. Это псевдоним, то НЕ ВЫДЕЛЕНИЕ ПАМЯТИ. ЭТО УКАЗАТЕЛЬ НА ПАМЯТЬ
Батаев Дмитрий Просветленный (21598) kh fjkg, а о чём? ты передал в функцию адрес массива и получил то, что нужно
Я об этом вашем сообщении пишу
————————————————
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных — НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
————————————————————
Непонятно какую область памяти забыли безвозвратно. Какого массива. Уточнение нужно чтоб полностью понять
————————————-
void func(int *arr) и void func(int arr[ ]) АНАЛОГИЧНЫ
————————————-
arr будет указателем потому что в ней хранится адрес.
Но сейчас не об этом.
Можете пожалуйста объяснить это сообщение?
——————————-
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указатель на первый элемент массива содержится в двух переменных — НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
——————————-
Я выделил два массива arr[] и massiv[]. Потом указатель arr содержится и в arr и в massiv(massiv тоже является указателем).
Моя потеря заключается только в 4 Байт? Столько занимает int в стеке.
Батаев Дмитрий Просветленный (21598) kh fjkg, int arr[]= < 1,2,3,4,5 >; ЭТО РЕАЛЬНО СУЩЕСТВУЕТ В ПАМЯТИ int massiv[]= < 1,2,3,4,5 >; ЭТОГО НЕТ В ПАМЯТИ void func(int massiv[]) ЭТО void func(указатель на местоположение массива arr в памяти)
Это называется утечкой в памяти? Я бы назвал это просто нерациональным использованием памяти. 4 байта потеря всего, но зато как быстро передался массив.
Батаев Дмитрий Просветленный (21598) kh fjkg, ТЫ НИЧЕГО НЕ ПОТЕРЯЛ, так как это всего лишь псевдоним, то есть при вызове функции ей через стек передаётся 4 байта памяти указателя на массив arr
это на с++, но тоже самое. НЕТ В ПАМЯТИ МАССИВА int massiv[] это всего лишь передаваемый адрес через стек в функцию
То что это псевдоним я написал в своём вопросе выше. Вы пытаетесь мне это «объяснить», потому что я неправильно выразился. Ок.
Про адреса и псевдонимы я знаю. Это как уже я сказал было сказано в вопросе, да криво, но сказано.
Сначала вы говорите что там что то теряется, сейчас уже ничего не теряется.
————————————————
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных — НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
————————————————
Если я ничего не теряю, то значит буду использовать эту функцию дальше.
Только мне ещё нужен способ присвоить левому массиву правый массив.
Батаев Дмитрий Просветленный (21598) kh fjkg, ПОЭЛЕМЕНТНО. Ибо присвоить один указатель другому это значит потерять один из массивов
https://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-c
то, что у тебя «получилось» с функцией, по сути эквивалентно варианту со звёздочкой, который ты выше по тексту хотел избежать
не понимаю, что не так с поэлементным присваиванием, на самом деле это единственный правильный вариант
если хочется, можно (и даже нужно) заюзать стандартную функцию типа memcpy
Сейчас замечаю что так оно и есть.
Почему тогда без звёздочки вне функции не получается.
В функции получается без звёздочки, а без функции не получается.
Что то типа этого:
int arr[]=;
int massiv[] = arr;
user49913 Просветленный (35847) потому что в аргументах функции стандарт языка предусматривает неявную трактовку [] как указателя, а просто при объявлении переменных — нет, только и всего да, немного неоднородно, но какая разница
Python-сообщество
- Начало
- » Центр помощи
- » Как в переменной приравнять значение массиву?
#1 Янв. 12, 2023 19:30:01
Как в переменной приравнять значение массиву?
Всем привет. мне нужно чтобы если у меня вводили название страны из массива. Выводилось что такое значение есть и далее можно продолжить, но как сделать так чтобы если значение в массиве есть его выводило?
Прикреплённый файлы:
Screenshot_1.png (33,1 KБ)
#2 Янв. 12, 2023 19:47:27
Как в переменной приравнять значение массиву?
удалите картинку с кодом из поста, вставьте код в сообщении
[code python]между этими тегами вставлять код[/code]
token — заменить звездочками — это ключ доступа к вашему боту, его не показывают 3м лицам
if message.text.title() in ports: bot.send_message(message.from_user.id, f'eсть несколько судов из ')
только так не красиво, нужно у стран менять окончания, не из Турция например, а Турции
удобнее выводить список с кнопками стран для выбора
Отредактировано xam1816 (Янв. 12, 2023 19:49:11)
#3 Янв. 12, 2023 22:43:44
Как в переменной приравнять значение массиву?
>>> dct = . 'Турция': . 'im': 'Турция', . 'ro': 'Турции', . 'da': 'Турции', . 'vi': 'Турцию', . 'tv': 'Турцией', . 'pr':'Турции' . >, . 'Индия': . 'im': 'Индия', . 'ro': 'Индии', . 'da': 'Индии', . 'vi': 'Индию', . 'tv': 'Индией', . 'pr':'Индии' . > . > >>> >>> print('Eсть несколько судов из <>'.format(dct['Турция']['ro'])) Eсть несколько судов из Турции >>> >>> print('Eсть несколько судов из <>'.format(dct['Индия']['ro'])) Eсть несколько судов из Индии >>> >>> print('Вы поедете в <> или в <>?'.format(dct['Турция']['vi'], dct['Индия']['vi'])) Вы поедете в Турцию или в Индию? >>>
КАК ПРИРАВНЯТЬ МАССИВЫ PYTHON
В Python приравнять (скопировать) один массив к другому можно с помощью среза (slice).
arr1 = [1, 2, 3, 4, 5]arr2 = arr1[:]print(arr2) # выведет [1, 2, 3, 4, 5]
В данном примере мы создали массив arr1 и скопировали его в массив arr2 с помощью среза arr1[:].
Еще один способ приравнять массивы — это создать новый объект, являющийся копией исходного массива.
import copy
arr1 = [1, 2, 3, 4, 5]arr2 = copy.copy(arr1)
print(arr2) # выведет [1, 2, 3, 4, 5]
В данном примере мы использовали модуль copy и его метод copy для создания копии массива arr1 в массив arr2.
Также, если нам нужно приравнять массивы, чтобы они ссылались на один и тот же объект, можно использовать оператор присваивания.
arr1 = [1, 2, 3, 4, 5]arr2 = arr1
print(arr2) # выведет [1, 2, 3, 4, 5]
В данном примере мы использовали оператор присваивания (=) для того, чтобы массив arr2 ссылался на тот же объект, что и массив arr1.
Уроки Python — Списки (Массивы)
МАССИВЫ, ЦИКЛЫ И ФУНКЦИИ за 181 СЕКУНДУ // Python ЕГЭ Информатика 2021
Python для ЕГЭ. Массивы с нуля. Снова цикл for и работа с массивами.
Python developer собеседование с задачей уровня хард из Яндекса . Ян Желанов
Уроки Python / Как в Python работать с массивами==списками
29 Вложенные списки Python
Как ввести список (массив) в Python
PYTHON массивы на ПРОСТЫХ примерах. Отличия от СПИСКОВ и принцип работы
- Python pdf книга
- Капитализация начальных букв каждого слова python
- Как вывести первый элемент словаря python
- Номер появления слова python
- Python перемножение матриц без numpy
- Как установить json для python
- Python строки тест
- Fasttext python примеры
- Антивирус на python
- Python преобразовать дату в timestamp
- Python xlsxwriter размер шрифта
- Python установка conda
- Python numpy библиотека
- Обход в глубину графа python
- Перебор всех подмножеств python