Найти - Пользователи
Полная версия: Списки и кортежы (list vs cortege) заставляем кортеж меняться :)
Начало » Python для экспертов » Списки и кортежы (list vs cortege) заставляем кортеж меняться :)
1 2 3
sypper-pit
Вобщем говорил я недавно с человечком и напомнил он мне про списки и кортежи. честно говоря много что с годами по вылетало из башки дырявой. я возьми и ляпни что кортежи могут меняться. А потом поседел подумал и оказывается я был прав.
>>> a = [3]
>>> b = 2
>>> c = (a,b)
>>> c
([3], 2)
>>> a[0] = 1
>>> c
([1], 2)
>>>

упс как так получилось вот только засада. Не пойму как вытянуть чистое значение из кортежа.

варианты типа
>>> d = c[0]
>>> d
[123]
>>> d[0]
123
>>> с[0]
и так понятны.
А вот что делать если нужно избавится от скобок в 1 приём. может кто тему развить сможет ?
Budulianin
sypper-pit
я возьми и ляпни что кортежи могут меняться. А потом поседел подумал и оказывается я был прав.

Tuple не меняется, меняется объект, на который хранится ссылка в tuple. В tuple, как содержалась ссылка на этот объект, так и будет содержаться.

sypper-pit
А вот что делать если нужно избавится от скобок в 1 приём. может кто тему развить сможет ?
Ты вообще о чём?
с[0][0]
kamisama
cortege взломан, все в катафалк!
sypper-pit
Budulianin
как содержалась ссылка на этот объект, так и будет содержаться.
Хорошо тогда как же получается такой расклад ?
>>> c
([1], 2)
>>> c[0][0]
1
>>> a = 123
>>> c[0][0]
1
>>> c
([1], 2)
>>>
При этом я изменил “a” на другое значение и кортеж не поменялся.
Вероятно имеется в виду ссылка на объект == именно в память ЭВМ. Я тоже так думал по началу, может просто в блок памяти ссылается в которой я произвожу изменения. И для эксперимента я вбил в код значение “a” точно превышающее блок памяти. и изменение произошло. внутри кортежа.

kamisama
cortege взломан, все в катафалк!
Тема создана больше для прикола чем для практического применения, хотя может кому и пригодится эта фича.
Budulianin
Ты вообще о чём?
с[0][0]
да я об этом … только как это сделать минуя
 [0][0]
- это же по сути и есть пример выше только без лишней переменной. Думаю никак не выйдет вытянуть.
JOHN_16
sypper-pit
вы забыли что переменная это тоже не изменяемый тип:
>>> a=1
>>> id(a)
14282952
>>>
>>> a=2
>>> id(a)
14282940
sypper-pit
Так и получается тогда, что кортеж не создаёт новый блок в памяти, а ссылается на тип переменной.
Возможно это связанно с попыткой сохранить ОЗУ и не забивать её новыми данными.
bismigalis
Вот что форкекс окоянный с людьми делает
Budulianin
sypper-pit
Хорошо тогда как же получается такой расклад ?
sypper-pit
При этом я изменил “a” на другое значение и кортеж не поменялся.
sypper-pit
Тема создана больше для прикола чем для практического применения, хотя может кому и пригодится эта фича.

Какая фича? WTF?

Ты просто не понимаешь, что происходит.

>>> c
([1], 2)
>>> c[0][0]
1
>>> a = 123
>>> c[0][0]
1
>>> c
([1], 2)
>>>

Tuple хранит ссылки на объекты. Ну засунул ты в a ссылку на 123, почему ссылка в tuple должна от этого измениться? Это tuple и он не изменяется и точка.

sypper-pit
Зарегистрирован: 2009-01-30
sypper-pit
Сообщения: 1017
WTF!?

>>> a = [1]
>>> b = (a,)
>>> id(a)
4459235232
>>> id(b[0])
4459235232
>>> a = 123
>>> id(a)
140604929500048
>>> id(b[0])
4459235232
sypper-pit
Budulianin
Сам tuple не изменятся я об этом знаю. И по идее не должны изменяться данные внутри него. Просто я подумал, что кортежи хранят внутри себя только сами данные и никак нельзя их изменить(не учитывая изменения в блоке памяти итд). Получается что изменить данные всё же можно. И вот в чем был эксперимент.

Вопрос был именно как вытянуть данные используя
[0]
а не
[0][0]
Говорю же это всё несёт чисто экспериментальный характер.

bismigalis
sypper-pit
сам себе противоречишь
говоришь что tuple изменяемый и в тоже время не можешь изменить первый элемент тупля с массива на число
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB