Pythonにおける可変型の小実験について


Pythonにおける可変型の小実験について
最近pythonの可変(immutable)タイプについて、int、float、string、tupleはいずれも可変タイプであるという問題を見ました.私の最初の理解は、pythonの可変タイプは、同じ値が同じオブジェクトで、異なる値が異なるオブジェクトで、変数値が変わると元のオブジェクトを指さないことです.事実は、この理解が理想化され、実際の状況と合わないことを証明している.
最初の小さな実験では問題は見られませんでした
x = y = 1
x = 2
print(x,y,id(x),id(y))#      
y = 2
print(x,y,id(x),id(y))#      

#    python ,  1,  2,          ,     2      

x = y = [1]
x[0] = 2
print(x,y,id(x),id(y))#   ,    ,  x、y        
x = [1]
y = [1]
print(x,y,id(x),id(y))#   ,     ,        
#  list       ,          

2番目の小さな実験で現れた状況は、冒頭の見方をさらに固めた.
def foo(x):
    print('id(x)=',id(x))#  x     a  ,    ,   ,       
    x += 5
    print('id(x`)=',id(x))#  x        ,     
    x -= 1
    print('id(x``)=',id(x))#        
    #     x  82,y      x`  
    return x

a = 77
print('id(a)=',id(a))
y = foo(a)
print('a=',a,',y=',y)
print('id(y)=',id(y))

3つ目は多くの事故が発生しました
a = "asdf"
b = "ghjk"
c = "asdf"
print('id(a)=',id(a),'id(b)=',id(b),'id(c)=',id(c))
#a、c    

a = 2.0
b = 2.001
c = a + 0.001
d = 2.001
print(a,'id(a)=',id(a),b,'id(b)=',id(b),c,'id(c)=',id(c),d,'id(d)=',id(d))
#b、d    ,  c  , b、c、d   ,            

a = (1,2)
b = (1,2)
r = 2
c =(1,r)
print(a,'id(a)=',id(a),b,'id(b)=',id(b),c,'id(c)',id(c))
#     ,     ,  tuple “   ”         。
a = (1,2)
print(a,'id(a)=',id(a))
#a        

a = "asdf"
b = "asd"
print(a,b,'id(a)=',id(a),'id(b)=',id(b))
b += 'f'
print(a,b,'id(a)=',id(a),'id(b)=',id(b))#  a、b   ,    

#   ,  b      a     ,       ,                  
#b      "asd"、"asdf"    ,          , list   

c = "apple"
f = "maple"
print(c,id(c))
d = c.replace('f','t')
e = c.replace('ap','ma')
print(d,id(d),e,id(e),f,id(f))#c、d    ,        
#    ,apple     ,maple     ,       maple    ,d   

ある条件下でstringタイプが+=後idで変わらないことを試した人がいる.(https://web.eecs.utk.edu/~azh/blog/pythonstringsaremutable.html)
暫定的な結論はintが先頭の理解に最も近く,float,stringは初期値の場所でのみ成立する.tupleが修正してはいけない「可変」になるまで待つ.