addressof object with id()
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Sat Mar 23 22:01:22 EDT 2013
On Sat, 23 Mar 2013 21:00:07 -0400, Roy Smith wrote:
> In article <mailman.3657.1364085583.2939.python-list at python.org>,
> Fabian von Romberg <fromberg100 at hotmail.com> wrote:
>
>> Hi,
>>
>> I have a single questions regarding id() built-in function.
>>
>> example 1:
>>
>> var1 = "some string"
>> var2 = "some string"
>>
>> if use the id() function on both, it returns exactly the same address.
>
> Yup.
Nope. Did you actually try it?
As far as I know, there is no Python implementation that automatically
interns strings which are not valid identifiers. "some string" is not a
valid identifier, due to the space.
[...]
> which is, of course, the result I expected. Then I tried:
>
>>>> z = "f" + "oo"
>>>> id(z)
> 3810944
>
> which actually surprised me. I had thought interning only affected
> string literals, but apparently it works for all strings! This works
> too:
>
>>>> a = "b" + "ar"
>>>> b = "ba" + "r"
>>>> id(a)
> 3810152
>>>> id(b)
> 3810152
You're not actually testing what you think you're testing. In Cpython,
which I assume you are using, there is a keyhole optimizer that runs when
code is compiled to byte-code, and it folds some constant expressions
like `a = "b" + "ar"` to `a = "bar"`. To defeat the keyhole optimizer,
you need something like this:
a = "bar"
b = "".join(["b", "a", "r"])
although of course a sufficiently smart keyhole optimizer could recognise
that as a constant as well. This, on the other hand, will defeat it:
b = str("ba") + str("r")
because the keyhole optimizer cannot tell whether str() is still the
built-in function or has been replaced by something else.
> but, again, none of this is guaranteed.
Correct.
--
Steven
More information about the Python-list
mailing list