14
>>> s1 = "spam"
>>> s2 = "spam"
>>> s1 is s2
True
>>> q = 'asdalksdjfla;ksdjf;laksdjfals;kdfjasl;fjasdf'
>>> r = 'asdalksdjfla;ksdjf;laksdjfals;kdfjasl;fjasdf'
>>> q is r
False

How many characters should have to s1 is s2 give False? Where is limit? i.e. I am asking how long a string has to be before python starts making separate copies of it.

martineau
  • 119,623
  • 25
  • 170
  • 301
krzyhub
  • 6,285
  • 11
  • 42
  • 68
  • 1
    Are you asking how long a string has to be before python starts making separate copies of it? – Matt Fenwick May 16 '12 at 16:12
  • 11
    It's completely implementation dependent and could change in the next version of Python without warning. Why do you want to know? – Mark Ransom May 16 '12 at 16:13
  • 2
    Yes, I am asking how long a string has to be before python starts making separate copies of it. – krzyhub May 16 '12 at 16:13
  • @Cris: What are you trying to accomplish? The behavior is implementation-defined and cannot be relied on. Why not just check for equality? – Daenyth May 16 '12 at 16:14
  • 4
    I just want know for knowing. Don't know that this is no important and very flexible. – krzyhub May 16 '12 at 16:15
  • 1
    if you just want to know, why don't you test it on the implementation *you*'re using? – Karoly Horvath May 16 '12 at 16:16
  • 5
    if i will only testing i will never get knowledge that this is implementation dependent – krzyhub May 16 '12 at 16:18
  • 1
    Note that you may get a different result if you put your example statements in a script, instead of trying them interactively. – Janne Karila May 16 '12 at 17:45

3 Answers3

14

String interning is implementation specific and shouldn't be relied upon, use equality testing if you want to check two strings are identical.

MattH
  • 37,273
  • 11
  • 82
  • 84
12

If you want, for some bizarre reason, to force the comparison to be true then use the intern function:

>>> a = intern('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp')
>>> b = intern('12345678012345678901234567890qazwsxedcrfvtgbyhnujmikolp')
>>> a is b
True
Spaceghost
  • 6,835
  • 3
  • 28
  • 42
6

Here is a piece of comment about interned string from CPython 2.5.0 source file (stringobject.h)

/* ... ... This is generally restricted to strings that **"look like" Python identifiers**, although the intern() builtin can be used to force interning of any string ... ... */

Accordingly, strings contain only underscores, digits or alphabets will be interned. In your example, q and ``r contain ;, so they will not be interned.

vaultah
  • 44,105
  • 12
  • 114
  • 143
morsel.wang
  • 123
  • 2
  • 5