¿Por qué el operador не "является" никакой funciona доблестью компаратора параграфа?

Estuve usando el operador is доблесть компаратора параграфа Python en idénticos, mas realizando un ejercicio resulta que no отвечает Комо esperaba.

Ejemplo 1

a = 1
b = 1
print(a is b)
True

Ejemplo 2

a = 1000
b = 1000
print(a is b)
False

Никакой сын entiendo la razón de que los ejemplos respondan diferente si en ambos casos los valores iguales.

6
задан 14.11.2019, 11:38
2 ответа

Есть много очень интересных вещей, которые нужно комментировать в этом вопросе. Мы идем по частям:

Когда бы то ни было использовать is, чтобы сравнивать стоимость

Оператор is имеет поручение очень especГ-fico и состоит в том, чтобы видеть, "указывают" ли две переменные на тот же объект. Для понимания этому помогает знать немного cГіmo - модель данных Пайтона.

, Если ты знаешь C, ты dirГ, - в который совсем в python меткие в объекты . Если ты не знаешь C, будьте достаточно говорить, что каждый изменчивый Пайтон не "ящик", в который ты помещал бы стоимость, но он - "суфлер", что seГ±ala в объект, который является тем, кто действительно имеет стоимость (и тип). Поэтому у переменной в sГ - нет типа, а информации, на которую он "указывает".

Это tambiГ©n стоит для целых чисел. Следовательно, когда ты делаешь:

a = 1000

intГ©rprete python верьте в объект типа int, сохраняй в этом объекте стоимость 1000, и он делает, что идентификатор a "seГ±ale" в этот объект. SerГ - в нее situaciГіn следующий:

a

, Если despuГ©s ты делаешь

b = a

Тогда, создает нового идентификатора b, что apuntarГЎ в ту же информацию, что и a, так как это - то, что происходит, когда ты распределяешь переменную другой (это применимое tambiГ©n к спискам, цепям, или любому другому типу, и даже, если b - аргумент одной funciГіn в ту, которая ты перемещаешь a как parГЎmetro). Она situaciГіn сейчас serГЎ:

a y b

В этом моменте a и b имеют в виду тот же объект. Следовательно a is b serГЎ True, так как для этого он, для которого служит оператор is, чтобы видеть, относятся ли оба к тому же объекту. Оператор == взамен сравнивает объекты . Естественно a==b tambiГ©n serГЎ True, если a и b имеют в виду тот же объект.

Предложение: неизменность и reasignaciГіn

QuizГЎs ты estГ©s спрашивая "Это не может быть asГ,, - итак, если я сейчас меняю стоимость b делая например b=b+1 tambiГ©n cambiarГЎ тот a, Вїno?"

Следует, что нет, потому что целое число - неизменные , которые значат, что ты не можешь менять это на другой. nГєmero 1000 не состоит nГєmero 1000, и никогда podrГЎ в том, чтобы превращаться в nГєmero 1001.

ВЎUn момент! estarГЎs думая. ВїCГіmo, что нет? ВїquГ© происходит тогда, если я делаю...

b = b + 1

то, что происходит, достаточно удивительное. intГ©rprete Пайтон tendrГЎ, что оценивать правую сторону ее asignaciГіn, для чего crearГЎ другое целое число со стоимостью 1, и это sumarГЎ в целое число "seГ±alado" из-за b, которых, как мы видели, 1000. Результат этой суммы выходит 1001, и следовательно Пайтон crearГЎ новая информация для результата, со стоимостью 1001, и reasignarГЎ переменная b для того, чтобы он указал на эту новую информацию. 1000 оригинал не был изменен (не podrГ - в, так как он неизменный). Вещь остается следовательно asГ - вслед за нею lГ-nea предыдущий:

b+1

Естественно сейчас уже фальшивый, что a == b и tambiГ©n, что a is b, так как они указывают на различные объекты.

Тогда, возвращаясь в твой вопрос

Это объясняет второй случай в твоем вопросе:

a = 1000
b = 1000
print(a is b)    # Sale False

, так как эти ассигнования дают место в следующую фигуру:

a = 1000, b = 1000

, Где мы можем видеть ясно, что они указывают на отдельные объекты, и следовательно a is b он фальшивый, но у этих объектов есть та же стоимость и следовательно a == b истинный.

Однако ВїQuГ© estГЎ происходя aquГ-?

a = 1
b = 1
print(a is b)    # Sale True (¿¿¿???)

Вїno deberГ, - чтобы быть этим случаем, равным предыдущему?

, Так как следует, что не . Почти необъяснимой формы, их lГ-neas предыдущие они дают место в следующую фигуру:

a=1 b=1

Видя фигуру остается ясным, что a is b истинный, но Вїpor quГ© 1 ведет себя 1000 различно?

Восток - деталь optimizaciГіn intГ©rprete CPython. Оказывается, что он intГ©rprete, чтобы улучшать Ваши предоставления, у него есть уже созданных заранее целые числа между-5 и 256, обоими включая [ снабжает ссылками ], потому что эти целые числа используются очень часто. Когда переменная в твоей программе распределена в одно из этих целых чисел, заставляют его указывать на пред-созданную информацию. Поэтому в конце концов a и b обозначаются "в сам 1". И в действительности все переменные твоей программы, которые стоят 1, apuntarГЎn "в сам 1".

Из всех форм, это одна caracterГ-stica в той, которую не deberГ-схватывай основываться во время писания программ. Тот факт, что для этих целых чисел в особенности (и tambiГ©n для каких-то цепей) is оно функционировало, оно не прекращает быть "происшествием". Никогда не оснуйся на этом.

Окончательно, используй is, когда ты захочешь посмотреть, если два типа стоимости "seГ±alan" в ту же информацию, и используй ==, когда ты захочешь сравнить, если данные seГ±alados равны.

17
ответ дан 01.12.2019, 12:27
  • 1
    Хорошая explicació n, хотя в моем opinió n ответ está в ú ltimos 3 параграфа. ¿ У тебя есть шрифт, о котором упоминает optimizació n CPython? – gustavovelascoh 07.11.2019, 18:31
  • 2
    @gustavovelascoh Существую añ adido ссылка на ответ, и исправленного шага, что nú пред-созданные морские окуни начинаются в-5 и не в 0. – abulafia 07.11.2019, 18:48
  • 3
    ¡ Превосходный explicació n! Хотя ответ está во фразе " Когда бы то ни было использовать is, чтобы сравнивать valores" опора, следующая за фразой вносит много стоимость. – Javier Reséndiz 07.11.2019, 19:09
  • 4
    Большое спасибо из-за explicació n сейчас я остаюсь ясным @abulafia – Ivan Aroa Roy 08.11.2019, 16:06
  • 5
    Fantá stica ответ, qué интересный открытие, которого CPython оптимизирует между-5 и 256. – fedorqui 14.11.2019, 11:43

Оператор is не сравнивает, что два типа стоимости были idГ©nticos, но он сравнивает, куда они указывают на каждый из них.

, Если ты используешь функцию, пойдите (a) и пойдите (b) verГЎs объект, на который они указывают.

3
ответ дан 01.12.2019, 12:27

Теги

Похожие вопросы