Во время выполнения и без доступа к источнику нет абсолютно никакого способа узнать, являлась ли эта ссылка встроенной или была назначена первой переменной. В принципе вы можете сделать вид, что 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, чтобы пройти абстрактное синтаксическое дерево исходного кода.
Каково практическое применение знания этой информации? – deceze
Вы не можете этого сделать. почему ты хочешь сделать это? Я не могу придумать никаких практических оснований для этого. Это звучит как [проблема XY] (http://meta.stackexchange.com/q/66377/166789)? – Carpetsmoker
Контекст довольно сложный, поэтому я не стал подробно останавливаться здесь. По сути, он развивается вокруг перекодировщика Python в C++. Список дается, и мне нужно выяснить, должны ли классы по-прежнему нуждаться в определении на C++ или если они уже существуют (иначе, если они определены ранее, если существует переменная). –