according to the python official documentation, the id () function is interpreted as follows
In [1]: id?
Signature: id(obj, /)
Docstring:
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
Type: builtin_function_or_method
returns a dynamically created string with the input () function, whose memory address is not predictable.
while tt2 = 'TT'; tt3 =' TT'; , the python interpreter saves only the first 'TT' string, and the second' TT' is directed to the previous one. So their id () results are the same. Changing tt2 or tt3 will result in a new string without changing the 'TT' content.
this question seems simple, but it touches the bottom of the computer!
according to the first chapter of in-depth understanding of computer Systems, information is bit + context .
so, let's take a look at how Python defines the id () function:
>>>help(id)
Help on built-in function id in module builtins:
id(obj, /)
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
(END)
it is obvious that the, id (object) function returns the address of the object object in memory.
however, according to the definition of information in in-depth understanding of computer Systems, you will realize the frivolous tonality of python documents. There is no mention of context , no mention of object life cycle , which is not rigorous. Because the important context relationship is not mentioned.
for a better understanding, especially the life cycle, that is, contextual relationships ,
I made two scripts:
test1.py
is as follows:
print(__name__)
test1 = input('ttt>>>').strip()
print(test1)
print(id(test1))
test2 = 'TT'
print(id(test2))
test2.py
is as follows:
test3 = 'TT'
print(__name__)
print(id(test3))
run the first script, showing that the main program is _ _ main__
. As a result, you will find that the script is the same as the subject, and the two id are different.
run the second script, which shows that the main program is _ _ main__
. As a result, you will find that the id here is also different from the first.
that is, the corresponding memory address of the object is different because the context , or the life cycle of the program is different.
be more straightforward , you run the first script many times, and each time id displays almost is different. The same is true of
running the second script.
as to why I use the word almost , I'll leave it to you to look it up.
>>> test = input('TT>>')
TT>>'TT'
>>> test2 = 'TT'
>>> id(test)
4401760416
>>> id(test2)
4401760416
the above is the result of execution in the Python2 environment. Both id are the same.
so what the subject really needs to know is the difference between input in python2 and python3.
How to choose
= = and is?
The
= = operator compares the values of two objects, and you can use the _ _ eq__ magic method overload to achieve a custom comparison.
is compares the id identities of two objects and cannot be overloaded. It is usually used to compare variables directly with singleton values, such as is None.
Why is id the same sometimes?
first of all, id is not the same just because it is an immutable type.
Cpython has a detail optimization called resident (interning), which optimizes strings and small integers to share the same reference.
note, however, that this optimization does not apply to immutable types, nor does it apply to all strings and integers, as shown in the source code implementation.