2016-03-08 3 views
0

Учитывая список a, я ищу способ программно узнать, если элемент списка определяется рядный, т.е.Python: рядный против определения переменной

a = [123] 

или по ссылке, т.е.

number = 123 
a = [number] 

и если последнее, то, что имя переменной.

Любые подсказки?

+0

Каково практическое применение знания этой информации? – deceze

+4

Вы не можете этого сделать. почему ты хочешь сделать это? Я не могу придумать никаких практических оснований для этого. Это звучит как [проблема XY] (http://meta.stackexchange.com/q/66377/166789)? – Carpetsmoker

+0

Контекст довольно сложный, поэтому я не стал подробно останавливаться здесь. По сути, он развивается вокруг перекодировщика Python в C++. Список дается, и мне нужно выяснить, должны ли классы по-прежнему нуждаться в определении на C++ или если они уже существуют (иначе, если они определены ранее, если существует переменная). –

ответ

0

Если number по-прежнему доступны для вас, вы могли бы сравнить так:

id(number) == id(a[0])

В зависимости от ваших дальнейших требований, однако, это не может быть все, что вам нужно.

+0

Вы уверены, что это работает? Потому что 'id (2) == id (2)' is 'True', как' a = 2; id (a) == id (2) '. Я не вижу причин, почему это необходимо, поскольку числа всегда указывают на один и тот же объект (IIRC он отличается от строк, но даже там короткие строки могут ссылаться на один и тот же базовый объект). – Carpetsmoker

+0

@Carpetsmoker - Отсюда мой комментарий: «В зависимости от ваших дальнейших требований, это может быть не все, что вам нужно». Без дополнительной информации от OP я не могу гарантировать, что этого будет или будет недостаточно. – Nicarus

+0

Но он всегда возвращает «Истину», насколько я вижу?Так в какой ситуации это будет работать тогда? – Carpetsmoker

4

Пройдите abstract syntax tree от кода, который вы переводите. Один будет Num, а другой будет именем. Это невозможно сделать на основе самого списка, поскольку в целом объекты не имеют журналов, как они появились, и в этом примере оптимизатор, возможно, изменил метод в первую очередь.

0

Во время выполнения и без доступа к источнику нет абсолютно никакого способа узнать, являлась ли эта ссылка встроенной или была назначена первой переменной. В принципе вы можете сделать вид, что sys.getrefcount() может сказать правду:

% python3 
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class Foo(): 
...  pass 
... 
>>> import sys 
>>> sys.getrefcount(Foo()) 
1 
>>> bar = Foo() 
>>> sys.getrefcount(bar) 
2 

Но небольшие целые числа и постоянные строки будут иметь общие ссылки и вещи падают вниз:

>>> sys.getrefcount('a') 
6 
>>> sys.getrefcount(1) 
758 

И тогда вы бы иметь дело того, что значение была создана в функции но вернулся туда и что исходная ссылка была утеряна, а что нет ...


единственный действительно использовать способ, который я знаю я s, чтобы пройти абстрактное синтаксическое дерево исходного кода.

Смежные вопросы