|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
0.
>>> s = [3,1]
>>> id(s)
1924965623360
>>> s *= 2
>>> id(s)
1924965623360
>>> s
[3, 1, 3, 1]
>>> s = [3,1,3,1]
>>> id(s)
1924965974720
前两个id一样我能理解,可变序列是在原位置修改 “扩容”,但是当我手动再次输入相同值的列表s为什么id却不同了?
1.
>>> s = [1]
>>> id(s)
1924965623296
>>> s=[1]
>>> id(s)
1924930235328
第一个s列表赋值加空格,第二个没加空格,输出的id为啥会不一样呢?
2.
>>> s = [1]
>>> id(s)
1924930235328
>>> s[1:2] = [2]
>>> s
[1, 2]
>>> id(s)
1924930235328
>>> s[1:] = [3]
>>> s
[1, 3]
>>> id(s)
1924930235328
对s用切片和语法不改变id,但是用+(拼接)却改变了
>>> s.append(4)
>>> s
[1, 3, 4]
>>> id(s)
1924930235328
>>> s = s+[5]
>>> s
[1, 3, 4, 5]
>>> id(s)
1924965327808
综上,请问各位前辈,作为字符的身份证(唯一标识id),什么情况id可变,什么情况id不变。感谢各位前辈指点。
本帖最后由 isdkz 于 2022-3-11 22:07 编辑
在 python 中 id 用于标识变量的地址,改变了变量的指向,地址变了 id 自然跟着变,
改变变量的指向的操作即赋值操作,所以对原来的变量重新赋值 id 就会变,没有对原来的变量重新赋值 id 就不变,
这里有一个挺有意思的就是对于可变对象来说 a += b 并不等同于 a = a + b,
>>> a = [1, 2, 3]
>>> id(a)
2585549852480
>>> a = a + [4]
>>> id(a) # 地址变了
2585549898176
>>> a += [5]
>>> id(a) # 地址还是跟上次的地址一样,没有发生变化
2585549898176
>>>
所以在可变对象中 += 也是对原来的内存进行操作,不会导致 id 发生变化
|
|