Я пытаюсь понять, что происходит с назначением и созданием новых ссылок на объект, или почему я получаю новый созданный объект при назначении.
Я не могу понять, как Python и / или Sublime работают здесь.У меня есть этот простой Sublime плагин:
import sublime
import sublime_plugin
class TestpythonCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view
sel = view.sel()
sel_zero = sel[0];
sel_for = []
for r in sel:
sel_for.append(r)
sel_gen = [r for r in view.sel()]
print('SEL => ' + str(sel[0].a) +':' + str(sel[0].b) + ' ID: ' + str(id(sel[0])))
print(str(id(sel[0])) + ' .. ' + str(id(sel[0])) + ' .. access A value: ' + str(sel[0].a) + ' .. ' + str(id(sel[0])))
print('SEL[0] id is ' + str(id(sel[0])))
print('SEL_ZERO => ' + str(sel_zero.a) +':' + str(sel_zero.b) + ' ID: ' + str(id(sel_zero)))
print('SEL_FOR => ' + str(sel_for[0].a) +':' + str(sel_for[0].b) + ' ID: ' + str(id(sel_for[0])))
print('SEL_GEN => ' + str(sel_gen[0].a) +':' + str(sel_gen[0].b) + ' ID: ' + str(id(sel_gen[0])))
print('----- Test with self')
print(id(sel[0]) == id(sel[0]))
print(sel[0] is sel[0])
print(sel[0] == sel[0])
print('----- Test with list & generator function')
print(sel[0] is sel_zero)
print(sel[0] == sel_zero)
print(sel[0] is sel_for[0])
print(sel[0] == sel_for[0])
print(sel[0] is sel_gen[0])
print(sel[0] == sel_gen[0])
Выполнение этого возвращает:
SEL => 657:657 ID: 4378999048
4378998328 .. 4378998328 .. access A value: 657 .. 4378998328
SEL[0] id is 4378998328
SEL_ZERO => 657:657 ID: 4379000488
SEL_FOR => 657:657 ID: 4378996816
SEL_GEN => 657:657 ID: 4378998760
----- Test with self
True
False
True
----- Test with list & generator function
False
True
False
True
False
True
Теперь, слишком много вещей не имеют смысла для меня здесь:
- Первая печать показывает
sel[0]
идентификатор , чтобы быть 4378999048 , но печать его снова дает еще один идентификатор ( 4378998328 ) - Третий отпечаток делает то же самое;выглядит id , напечатанный в первой строке, потерян / изменен / не использован.
- First "Test with self" печать имеет смысл (сравнение строк id - True);но я не могу понять смысл второго отпечатка, используя
is
(почему sel[0] is not sel[0]
?).
Я пытаюсь понять, как здесь все работает.В частности, цель состоит в том, чтобы понять, почему я получаю новые объекты (вместо новой ссылки на тот же объект) при использовании выражения-генератора с for
.
Я использую SublimeText3 и Python 2.7.10 .
РЕДАКТИРОВАТЬ: Я был бы заинтересован в наилучшей практике для проверки ссылочного равенства , без использования is
(что кажется несовместимым, в зависимости от реализации и кэширования ).