Я написал 2 блока кода, как показано ниже, и запускал их по-разному с одной и той же виртуальной средой anaconda:
Первый:
a = 1431324 # just a long integer
b = 1431324 # same as a
print(a is b) # the result is 'False' running in Jupyter; the result is 'True' running in Pycharm
В Pycharm это похоже на a = 1431324 и b = a, но на самом деле должно быть иначе.
Второй:
a,b = 1431324,1431324
print(a is b) # the result is 'True' running in both Jupyter and Pycharm
Я знаю, что для коротких целых чисел python заранее создает объекты, которые никогда не будут собирать мусор, но для длинных целых чисел python не будет создавать объект заранее.
Но кажется, что иногда python никогда не создавал два объекта для одного и того же длинного целого числа. Итак, я смущен тем, что:






Если у вас есть эта функция:
def f():
a = 1431324
b = 1431324
return a is b
Вероятно, он вернется True.
Когда вы записываете a,b = 1431324,1431324 в свой REPL, он в основном «строит кортеж из двух элементов, 1431324 и 1431324, распаковывает его и сохраняет в двух переменных, a и b». Две константы 1431324 можно объединить, чтобы получить одно и то же (и оптимизатор глазка заменит построение кортежа предварительно созданной константой (1431324, 1431324).
Вы можете найти эту константу, посмотрев на байт-код:
>>> import dis
>>> code = compile('a,b = 1431324,1431324', '<str>', 'exec')
>>> dis.dis(code)
1 0 LOAD_CONST 0 ((1431324, 1431324))
2 UNPACK_SEQUENCE 2
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 LOAD_CONST 1 (None)
10 RETURN_VALUE
>>> code.co_consts
((1431324, 1431324), None)
>>> code.co_consts[0][0] is code.co_consts[0][1]
True
Когда у вас есть две разные строки, они компилируются отдельно, поэтому константы не объединяются:
>>> a = compile('a = 1431324', '<str>', 'exec')
>>> a.co_consts
(1431324, None)
>>> b = compile('b = 1431324', '<str>', 'exec')
>>> b.co_consts
(1431324, None)
>>> a.co_consts[0] is b.co_consts[0]
False
Это также происходит в PyCharm REPL. Возможно, вы вводили несколько строк одновременно или запускали полный скрипт (который перед выполнением компилируется в байт-код, поэтому константы объединяются).
Если создаются два одинаковых целых числа в том же сборнике, они будут использовать один и тот же объект (независимо от того, находятся ли они в диапазоне, который обычно кэшируется). Таким образом, разница, которую вы видите, просто связана с построчным выполнением по сравнению с запуском всего скрипта.