powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос начинающего Python'erа
7 сообщений из 7, страница 1 из 1
Вопрос начинающего Python'erа
    #38315108
gysgys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Python я не обнаружил оператора взятие ссылки и как понял после, потому, что в питоне всё и так является ссылкой a = 5; b = [1,2,3] a хранит ссылку на числовой объект, b ссылку на объект списка. Верно ли я это понял?
Исходя этого ещё один вопрос по коду

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
import copy

class gys:
    def __init__(self):
        self.gyslist = [1,2,3]
        self.gysa = 5

    def printgys(self):
        for i in self.gyslist:
            print i
        print self.gysa

a = gys()
b = copy.copy(a)
c = copy.deepcopy(a)

b.gysa = 6
b.gyslist[0] = 8

c.gysa = 9
c.gyslist[0] = 10 



Так вот изменяя b.gysa мы меняем только для конкретного экземпляра b, а изменяя b.gyslist[0] мы изменим gyslist и экземпляра a. С c экземпляорм ни того ни другого нету, т.к. применён deepcopy. Значит всё-таки неизменяемые объекты хранятся по значению, а изменяемые по ссылке?
...
Рейтинг: 0 / 0
Вопрос начинающего Python'erа
    #38315355
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gysgysЗначит всё-таки неизменяемые объекты хранятся по значению, а изменяемые по ссылке?
Конгениально

И да, не только хранятся, но и передаются и присваиваются.
...
Рейтинг: 0 / 0
Вопрос начинающего Python'erа
    #38315446
Gygys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FishHookgysgysЗначит всё-таки неизменяемые объекты хранятся по значению, а изменяемые по ссылке?
Конгениально

И да, не только хранятся, но и передаются и присваиваются.
Кст не факт. Я допустил ошибку в прошлых размышления, ведь обращаясь b.gysa = ... - я по факту создаю новый объект и изменяю саму ссылку, а когда обращаюсь к списку, ссылаюсь по ссылке и изменяю сам объект. Так что вполне логично, что всё храниться по ссылке.
...
Рейтинг: 0 / 0
Вопрос начинающего Python'erа
    #38315464
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GygysКст не факт.
Ну естественно. Ты бы лучше чем экпериментировать почитал что-нибудь, литературы масса.
...
Рейтинг: 0 / 0
Вопрос начинающего Python'erа
    #38315479
gysgys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FishHookGygysКст не факт.
Ну естественно. Ты бы лучше чем экпериментировать почитал что-нибудь, литературы масса.
Да вобщем-то читаю: Марк Лутц - Изучаем Python - 4-е, Бизли Д. - Python. Подробный справочник (4-е изд.) - 2010
Но там такие детали пока не обнаружил. Поэтому спросил у тех, кто уже в этом разобрался. Ты же сначала говоришь одно, теперь другое. Сам то разобрался? И почему такое скептическое отношение к экспериментам?
...
Рейтинг: 0 / 0
Вопрос начинающего Python'erа
    #38315499
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gysgysИ почему такое скептическое отношение к экспериментам?
Потому что твои эксперименты ничего не дадут. Чтобы таким образом что-нибудь понять, нужно хотя бы смотреть hash у объектов.
...
Рейтинг: 0 / 0
Вопрос начинающего Python'erа
    #38315539
gysgys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FishHookgysgysИ почему такое скептическое отношение к экспериментам?
Потому что твои эксперименты ничего не дадут. Чтобы таким образом что-нибудь понять, нужно хотя бы смотреть hash у объектов.
А если я скажу, что мои эксперименты дали результат и я сделал вывод, что все значения хранятся по ссылке. Вот пример:

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import sys
a = 5
sys.getrefcount(a)
b = 5
sys.getrefcount(a)
c = [1, 2, 3]
sys.getrefcount(c)
d = [1, 2, 3]
sys.getrefcount(c)
e = c
sys.getrefcount(c)

if a is b:
 print "a is b"
if c is d:
 print "c is d"
if c is e:
 print "c is e"



В данном случае после создания переменной b количество ссылок на объект переменной a увеличится - это связанно с кешированием pythona базовых неизменяемых типов, собственно только это уже говорит о том, что обе наших переменных ссылается на одни и тот-же объект, а значит являются ссылками. После создания переменной d количество ссылок на объект переменной c не выросло, что вполне логично, т.к. изменяемый объект, после создания переменной e количество ссылок на объект переменной c выросло, что тоже ожидаемо. И самый важный момент оператор is - проверяет идентичность, после всех проверок будет выведено: a is b и c is e, то есть те переменные которые абсолютно идентичны, а по факту содержат ссылку на один и тот же объект.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Вопрос начинающего Python'erа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]