Ссылки в Python

У меня есть многоадресная сеть, которая должна постоянно отправлять данные всем другим пользователям. Эти данные будут постоянно меняться, поэтому я не хочу, чтобы программист имел дело с отправкой пакетов пользователям. Из-за этого я пытаюсь выяснить, как я могу ссылаться на любой объект или переменную в Python (я новичок в Python), поэтому он может быть изменен пользователем и изменяет то, что отправлено в пакетах многоадресной рассылки.

Вот пример того, что я хочу:

>>> test = "test" >>> mdc = MulticastDataClient() >>> mdc.add(test) # added into an internal list that is sent to all users # here we can see that we are successfully receiving the data >>> print mdc.receive() {'192.168.1.10_0': 'test'} # now we try to change the value of test >>> test = "this should change" >>> print mdc.receive() {'192.168.1.10_0': 'test'} # want 'test' to change to -> 'this should change' 

Любая помощь в том, как я могу это исправить, очень ценится.

ОБНОВИТЬ:

Я тоже пробовал это:

 >>> test = [1, "test"] >>> mdc = MulticastDataClient() >>> mdc.add(test) >>> mdc.receive() {'192.168.1.10_1': 'test'} >>> test[1] = "change!" >>> mdc.receive() {'192.168.1.10_1': 'change!'} 

Это работало. Однако,

 >>> val = "ftw!" >>> nextTest = [4, val] >>> mdc.add(nextTest) >>> mdc.receive() {'192.168.1.10_1': 'change!', '192.168.1.10_4': 'ftw!'} >>> val = "different." >>> mdc.receive() {'192.168.1.10_1': 'change!', '192.168.1.10_4': 'ftw!'} 

Это не работает. Мне нужно «ftw!» стать «разными». в этом случае. Я использую строки для тестирования, и я использую для строк объекты из других языков. Я буду только редактировать содержимое внутри объекта, так что это закончит работу?

2 Solutions collect form web for “Ссылки в Python”

В python все является ссылкой, но строки не изменяемы. Поэтому в test есть ссылка на «тест». Если вы назначили «это должно измениться», чтобы test , просто измените его на другую ссылку. Но ваши клиенты все еще имеют ссылку на «тест». Или короче: в питоне это не работает! 😉

Решением может быть помещение данных в объект:

 data = {'someKey':"test"} mdc.add(data) 

Теперь ваши клиенты имеют ссылку на словарь. Если вы обновите словарь таким образом, ваши клиенты увидят изменения:

 data['someKey'] = "this should change" 

Вы не можете, не легко. Имя (переменная) в Python – это просто место для указателя. Перезапишите его, и вы просто замените указатель другим указателем, т. Е. Изменение будет видно только тем, кто использует одну и ту же переменную. Члены объекта в основном одинаковы, но поскольку их состояние видно всем с указателем на них, вы можете распространять такие изменения. Вам просто нужно использовать obj.var каждый раз . Конечно, строки (наряду с целыми числами, кортежами, несколькими другими встроенными типами и несколькими другими типами) неизменяемы, т. Е. Вы ничего не можете изменить, чтобы другие могли видеть, поскольку вы вообще не можете его изменить.

Тем не менее, изменчивость объектов открывает еще одну возможность: вы могли бы , если бы потрудились вытащить ее, написать класс оболочки, содержащий объект abritary, позволяющий изменить этот объект, хотя метод set() и делегирует все, что важно для этого объекта. Раньше или позже вы могли бы столкнуться с неприятными неприятностями. Например, я не могу себе представить, что это хорошо сыграло бы с метапрограммированием, которое проходит через всех участников или что-то, что думает, что ему нужно возиться. Это также невероятно хакерский (то есть ненадежный). Возможно, это намного проще.

(На стороне примечание, PyPy имеет функцию become в одном из своих нестандартных пространств объектов, которые действительно и действительно заменяют один объект другим, видимым всем со ссылкой на этот объект. Он не работает ни с какими другими реализациями, хотя и я думаю, что невероятный потенциал и неправильное использование путаницы, а также тот факт, что большинство из нас редко когда-либо нуждались в этом, делает его почти неприемлемым в реальном коде.)

 
Interesting Posts for Van-Lav

список одиночных классов python

Как получить имя поданной формы в Flask?

Regex заменить текст в python

matplotlib, savefig: настройка DPI игнорируется

Как удалить строки из таблицы с помощью запроса SQLAlchemy без ORM?

Pandas: проверьте, существует ли строка с определенными значениями

Python – перемещение и перезапись файлов и папок

Как импортировать стандартную библиотеку вместо одноименного модуля в путь модуля

Алгоритм оптимального размещения обрезанных областей для захвата объектов (капли) в изображении

Отправка / получение сообщения WebSocket через сокет Python / клиент WebSocket

Как выполнить запрос для всех элементов в списке python

Прочтите много файлов csv и запишите их в кодировку utf8 с помощью python

как использовать пользовательский django templatetag с шаблоном django if statement?

Как получить тело электронной почты с помощью imaplib в python?

веб-приложение использует одно и то же хранилище данных

Python - лучший язык программирования в мире.