LINUX.ORG.RU

[Python] Стрельба в ногу

 


0

0

есть ли в питоне возможность положить в кортеж не копию объекта, а сам объект? То есть сделать что-то вроде этого:

foo = 'test string'
bar = ('String:', foo)
foo = 'Useful string'
print(bar)
('String', 'Useful string')

Ответ на: комментарий от hippi90

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

userid2
() автор топика

>положить в кортеж не копию объекта, а сам объект?

Питон по умолчанию неявно объекты копирует, что ли? :eek:

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Более того, судя по официальному описанию, передачи по ссылке не существует вообще.Если хочется иметь более одного имени для объекта - все имена должны быть в одном неймспейсе.

userid2
() автор топика
Ответ на: комментарий от rip86oz

Ректально, однако. Но лучшего метода не видно. И кстати, передача списка в функцию таким образом не сработает.

Интересно, с какими особенностями списков связана такая возможность?

userid2
() автор топика
Ответ на: комментарий от fat_angel

>ЕМНИП примитивные типы да

А в Питоне примитивные типы — объекты? :eek: А в чём же тогда их примитивность?

также как и жабка в общем то.

В Жабке примитивы — не объекты.

KRoN73 ★★★★★
()
Ответ на: комментарий от fat_angel

Проверил. Да, был идиотом. Со сложными типами копирования не происходит. Осталось разобраться, что наиболее питонично сделать с простыми типами для подобных извращений.

userid2
() автор топика

Когда пишешь foo='some string', ты тем самым кидаешь ссылку на строку 'some string' в foo. А в других переменных ссылки при этом не обновляются.

Но если вместо присваивания использовать методы объекта, то можно сделать примерно то, что тебе нужно:

class Foo:
    def __init__(self, s):
        self.setValue(s)
    def __str__(self):
        return self.s
    def __repr__(self):
        return self.s.__repr__()
    def setValue(self, s):
        self.s = s
foo = Foo('abc')
bar = ('def', foo)
foo.setValue('ghi')
print(bar)
anonymous
()
Ответ на: комментарий от userid2

Почему это передача листа в функцию не сработает так же? Все сработает... инфа 100%.

rip86oz
()
Ответ на: комментарий от fat_angel

Зря. Я уже отписался выше. Инты копируются. Объекты передаются по ссылке(по крайней мере, в конструктор кортежа).

userid2
() автор топика
Ответ на: комментарий от anonymous

И да, всем кому кажется, что что-то копируется — срочно учить матчасть питона.

anonymous
()

named tuple, похоже, - то, что надо.

schizoid ★★★
()
Ответ на: комментарий от KRoN73

А в Питоне примитивные типы — объекты?

да, но что там int'ы какие-то, там даже функция - объект :)

shty ★★★★★
()

RTFM же. В питоне ВСЕ что есть - объекты, и они ВСЕГДА передаются по ссылке и только по ссылке.

Но строки, числа и кортежи являются неизменяемыми объектами, поэтому хотя они и передаются по ссылке, но ведут себя как переданные по значению.

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

AIv ★★★★★
()

Кстати, раз уж пошла такая пьянка (не хочется ради такой мелочи тред отдельный создавать)...

Необходимо в питоне взять длинную-предлинную строку размера N (N делится на 3 нацело) разделить на N/3 строк, ну то есть сгенерировать список, кортеж, или что угодно, разницы большой в принципе и нет. И состоять должен этот список из этих троек символов, вот...

Ну или не 3, а любое другое число (принцип, думаю, понятен).

Что-то наподобие str.split, только деление не по определённому символу, а просто поровну.

Я написал цикл for(или можно while), и всё работает как надо, но чувствую, это не python-style, да? и, возможно, куда менее эффективно, чем тот же split.

BattleCoder ★★★★★
()
Ответ на: комментарий от userid2

> Ректально, однако

Ректально — это то, что ты хочешь сделать. Продумай архитектуру своей программы получше.

Более того, судя по официальному описанию, передачи по ссылке не существует вообще


И повнимательнее документацию почитай.

pevzi ★★★★★
()

Юзать обьект, внутри которого данные

vertexua ★★★★★
()
Ответ на: комментарий от pevzi

Непонятно только, почему такой фичи из коробки в каком-нибудь itertools нет.

pevzi ★★★★★
()
Ответ на: комментарий от pevzi

> In [10]: zip(*[iter(a)]*3)

Подумал 5 минут, понял, как это работает. В реальности оторвал бы руки тому, кто так напишет.

tailgunner ★★★★★
()
Ответ на: комментарий от BattleCoder

> Необходимо в питоне взять длинную-предлинную строку размера N (N делится на 3 нацело) разделить на N/3 строк

Я написал цикл for(или можно while), и всё работает как надо, но чувствую, это не python-style, да?

Можно сделать так: zip(a[0::3], a[1::3], a[2::3])

tailgunner ★★★★★
()
Ответ на: комментарий от ien

Ммм, а вот этот вариант поинтереснее. Спасибо... изучу.

BattleCoder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.