Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 104

Как изменить внешнюю переменную типа int внутри функций?

27.11.2015, 08:49. Показов 8598. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предположим есть переменная для хранения чисел типа int. Хотелось бы изменять её внутри функций и затем использовать её в основном модуле. Как это можно просто сделать?

Хотелось бы использовать нечто вроде:
Python
1
2
3
4
5
6
def inc(x):
    x += 1 # fail
if __name__ == '__main__':
    a = 1
    inc(a)
    print(a)
Но для примитивного типа это неработает. Можно создать список из одного элемента и с ним работать:
Python
1
2
3
4
5
6
def inc(x):
    x[0] += 1 # ok
if __name__ == '__main__':
    a = [1]
    inc(a)
    print(a[0])
В этом случае теряется читаемость. И вообще, прйдется писать во всех функциях [0].

Можно сделать класс и перегрузить операторы для основных операций:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A(object):
    def __init__(self, data):
        self.data = data
    def __repr__(self):
        return self.data
    def __str__(self):
        return str(self.data)
    def __iadd__(self, other):
        self.data += other
def inc(x):
    x += 1 # ok
if __name__ == '__main__':
    a = A(1)
    inc(a)
    print(a)
Может есть какой-то более лучший подход к решению этой проблемы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2015, 08:49
Ответы с готовыми решениями:

Как увидеть внешнюю переменную внутри класса
как обратиться к ней? вот например, мне нужно рисовать на холсте canvas изнутри класса class Rectangle { draw() { ...

Как сравнить переменную типа String с переменной типа Int?
Как сравнить переменную типа String с переменной типа Int в конструкции "if"???

Есть переменная типа char содержащая цифру; как записать это значение в переменную типа int?
Пожалуйста, напомните стандартную функцию

9
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
27.11.2015, 09:10
Python
1
2
3
def inc(x):
    global a
    a += 1
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2015, 10:07
Цитата Сообщение от kquick Посмотреть сообщение
Может есть какой-то более лучший подход к решению этой проблемы?
Предположим, что функция inc выбрана исключительно для демонстрации.
Python
1
2
3
4
5
6
def inc(a):
    return a + 1
 
 
a = 1
a = inc(a)
1
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 104
27.11.2015, 10:15  [ТС]
Цитата Сообщение от Vigi Посмотреть сообщение
Python
1
2
3
def inc(x):
* * global a
* * a += 1
Функции не должны ничего знать про название передаваемой переменной. При изменении оной придется изменять все функции, предположим их 1000.

Цитата Сообщение от 0x10 Посмотреть сообщение
Python
1
2
3
4
def inc(a):
* * return a + 1
a = 1
a = inc(a)
А если хотим, чтобы функция возвращала что-нибудь другое, но при этом изменяла a? Можно, конечно сделать так:
Python
1
2
3
4
5
6
def inc(a):
    return (a + 1, -a)
if __name__ == '__main__':
    a = 1
    a, something= inc(a)
    print(a, something)
Но это немного нето. Нужно, чтобы функция меняла переменную, и ничего незнала про её название снаружи.

Не по теме:

Python
1
2
3
4
5
6
7
def inc(a):
    # меняем a
    return -a
if __name__ == '__main__':
    a = 1
    something = inc(a)
    print(a, something)

0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2015, 10:20
Цитата Сообщение от kquick Посмотреть сообщение
Нужно, чтобы функция меняла переменную, и ничего незнала про её название снаружи.
Какая проблема решается? Дай более широкий контекст. Возможно, есть другие выразительные средства для решения задачи.

Каждый out-параметр функции — это сайд-эффект. Множество out-параметров усложняют понимание и отладку кода. Лучше пересмотреть такой дизайн.
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
27.11.2015, 10:24
Глобальные переменные - зло лютое, их нельзя использовать.
Используйте ctypes.
Python
1
2
3
4
5
6
7
from ctypes import c_int
x = c_int(18)
 
def inc(i):
    i.value += 1
 
print x.value
Добавлено через 3 минуты
Или ещё вариант - список из одного значения.
Python
1
2
3
4
5
6
g = [12]
 
def inc(i):
    i[0] += 1
 
inc(g)
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2015, 10:28
dondublon, оба варианта были в первом посте. Вариант с ctypes похож на создание своей обертки, но использование этой библиотеки — почти наверняка не то, чего хочет автор. Из документации:
ctypes is a foreign function library for Python. It provides C compatible data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python.
Т.к. не была обозначена конкретная задача, я предполагаю, что дергать функции из шареных библиотек автор не собирается. Следовательно, такое использование ctypes можно считать нецелевым и создающим необоснованную зависимость.
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
27.11.2015, 10:34
Цитата Сообщение от 0x10 Посмотреть сообщение
оба варианта были в первом посте.
Да, второй был. Просмотрел. Первого не было.
Цитата Сообщение от 0x10 Посмотреть сообщение
Вариант с ctypes похож на создание своей обертки,
Ну так тут и нужна обёртка, никак не обойдёшь.
Цитата Сообщение от 0x10 Посмотреть сообщение
Из документации:
Я в курсе.
Цитата Сообщение от 0x10 Посмотреть сообщение
дергать функции из шареных библиотек автор не собирается. Следовательно, такое использование ctypes можно считать нецелевым и создающим необоснованную зависимость.
Это стандартная библиотека.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.11.2015, 10:38
Цитата Сообщение от dondublon Посмотреть сообщение
Это стандартная библиотека.
Я в курсе.
Мне не нравится сам факт использования модуля для сохранения определенной сигнатуры функции, хотя модуль предназначен для другого. Потому и спрашивал у автора выше контекст проблемы.
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
27.11.2015, 11:16
Ещё вариант.
Зачем нам функция? Чтобы многократно вызывать один и тот же код. Этот код можно записать в строку и его многократно вызывать:
Python
1
2
g = 12
exec('g+=1')
Добавлено через 12 минут
К предыдущему. Для быстродействия код надо скомпилировать:
Python
1
2
3
import codeop
cc = codeop.compile_command('g+=1')
exec(cc)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.11.2015, 11:16
Помогаю со студенческими работами здесь

Инкремент адреса внутри функции с воздействием на внешнюю переменную
Есть код #include <stdio.h> void func(char *str) { ++str; } int main(void)

Как в Toast использовать переменную типа int
Как в Toast.makeText(this, a, Toast.LENGTH_SHORT).show();использовать переменную типа Int Забыл, помню как то так делается String a...

Как передать в stringstream переменную типа int?
Как запихнуть в stringstram int? Не находит такой перегруженной функции. sstream заинклудил. ifstream...

Как переменную типа int засунуть в Vector?
Как переменную типа int засунуть в Vector Vector v = new Vector(); v.addelement(2); v.addelement(2); Не катит так как надо...

Как изменить переменную внутри события?
Как нужно создавать событие (event), чтобы потом подписчик события мог в момент его срабатывания изменить один из аргументов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru