Input () Python 3 возвращает строку, которая не является тем же объектом, что и тот же литерал str - PullRequest
3 голосов
/ 27 декабря 2011

Я столкнулся с интересным поведением с Python 3, которое я не понимаю.Я понял, что со встроенными неизменяемыми типами, такими как str, int и т. Д., Не только равны две переменные с одинаковым значением (обе содержат «x»), но и являются буквально одним и тем же объектом, что позволяет использоватьоператор is.Однако, когда я использую функцию input (), создается впечатление, что создается строковый объект, который НЕ является тем же объектом, но имеет то же значение.

Вот мое интерактивное приглашение на языке python:

$ python
Python 3.2 (r32:88452, Feb 20 2011, 11:12:31) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> x = input()
test
>>> y = 'test'
>>> x is y
False
>>> x == y
True
>>> id(x)
4301225744
>>> id(y)
4301225576

Почему это?

Ответы [ 5 ]

2 голосов
/ 27 декабря 2011

Я понял, что с помощью встроенных неизменяемых типов, таких как str, int и т. Д., Не только две переменные одного и того же значения (обе содержат 'x') равны, они буквально являются одним и тем же объектом, который позволяет использовать оператор is.

Это ваше неправильное представление: относительно int s и long s, это справедливо только для нескольких значений;со строками любого типа это может быть верно в отношении строк одного модуля, но не иначе.

Но есть встроенная функция intern(), которая интернирует любую данную строку.

1 голос
/ 27 декабря 2011

Это из-за деталей реализации - вы не можете полагаться на is, возвращающую True в целом. Попробуйте этот скрипт:

x = 'test'
y = 'test'
print('%r: \'x == y\' is %s, \'x is y\' is %s' % (x, x == y, x is y))
x = 'testtest'
y = 'testtest'
print('%r: \'x == y\' is %s, \'x is y\' is %s' % (x, x == y, x is y))
for i in range(1, 100):
    x = 'test' * i
    y = 'test' * i
    print('%d: %r: \'x == y\' is %s, \'x is y\' is %s' % (i, x, x == y, x is y))
    if x is not y:
        break

Это печатает

'test': 'x == y' is True, 'x is y' is True
'testtest': 'x == y' is True, 'x is y' is True
1: 'test': 'x == y' is True, 'x is y' is True
2: 'testtest': 'x == y' is True, 'x is y' is False

На Jython is возвращает False даже в первом отпечатке.

1 голос
/ 27 декабря 2011

Это правильное поведение.

x == y #True because they have a the same value

x is y #False because x isn't reference to y
id(x) == id(y) #False because as the above

Но:

x = input()
y = x  #rewrite reference of x to another variable
y == x and x is y and id(x) == id(y) #True 
0 голосов
/ 27 декабря 2011

Я понял, что со встроенными неизменяемыми типами, такими как str, int и т. Д., Не только две переменные с одинаковым значением (обе содержат 'x') равны, они буквально являются одним и тем же объектом

Нет, это не гарантируется, так же, как если я говорю об апельсине, который физически неотличим от того, который вы держите, это не гарантирует, что у меня нет другого апельсина в виду, что просто происходит выглядеть одинаково.

0 голосов
/ 27 декабря 2011

Значения, которые являются одинаковыми, , а не гарантированно являются одним и тем же экземпляром.Это просто оптимизация, на которую нельзя положиться.Не очень часто бывает целесообразно использовать is, вместо этого используйте ==.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...