Ссылки на Python - PullRequest
       26

Ссылки на Python

7 голосов
/ 31 мая 2011

У меня есть многоадресная сеть, которая должна непрерывно отправлять данные всем другим пользователям. Эти данные будут постоянно меняться, поэтому я не хочу, чтобы программисту приходилось иметь дело с отправкой пакетов пользователям. Из-за этого я пытаюсь выяснить, как сделать ссылку на любой объект или переменную в 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'

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

UPDATE:

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

>>> 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 ]

5 голосов
/ 31 мая 2011

В Python все ссылки, но строки не являются изменяемыми. Таким образом, test содержит ссылку на «тест». Если вы назначите «this следует изменить» на test, вы просто измените его на другую ссылку. Но ваши клиенты все еще имеют ссылку на «тест». Или короче: в питоне это не работает! ; -)

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

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

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

data['someKey'] = "this should change"
3 голосов
/ 31 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...