李二蛋 发表于 2022-3-11 21:43:03

id()函数相同不同问题

0.
>>> s =
>>> id(s)
1924965623360
>>> s *= 2
>>> id(s)
1924965623360
>>> s

>>> s =
>>> id(s)
1924965974720
前两个id一样我能理解,可变序列是在原位置修改 “扩容”,但是当我手动再次输入相同值的列表s为什么id却不同了?
1.
>>> s =
>>> id(s)
1924965623296
>>> s=
>>> id(s)
1924930235328
第一个s列表赋值加空格,第二个没加空格,输出的id为啥会不一样呢?
2.
>>> s =
>>> id(s)
1924930235328
>>> s =
>>> s

>>> id(s)
1924930235328
>>> s =
>>> s

>>> id(s)
1924930235328
对s用切片和语法不改变id,但是用+(拼接)却改变了
>>> s.append(4)
>>> s

>>> id(s)
1924930235328
>>> s = s+
>>> s

>>> id(s)
1924965327808
综上,请问各位前辈,作为字符的身份证(唯一标识id),什么情况id可变,什么情况id不变。感谢各位前辈指点。{:9_221:}

qq1151985918 发表于 2022-3-11 21:50:30

可变容器类例如列表集合字典,请将他们的地址理解为水缸,新增或者删减元素只是往水缸里添水或者从水缸倒水,而重新的赋值是另外的水缸,跟原来的不同。请理解为,只要在原水缸操作,那么ID就相同,只要经过重新赋值那么ID就不再是原来的地址,这一点和字符串数字之类完全不同。

isdkz 发表于 2022-3-11 22:05:01

本帖最后由 isdkz 于 2022-3-11 22:07 编辑

在 python 中 id 用于标识变量的地址,改变了变量的指向,地址变了 id 自然跟着变,

改变变量的指向的操作即赋值操作,所以对原来的变量重新赋值 id 就会变,没有对原来的变量重新赋值 id 就不变,

这里有一个挺有意思的就是对于可变对象来说 a += b 并不等同于 a = a + b,
>>> a =
>>> id(a)
2585549852480
>>> a = a +
>>> id(a)                   # 地址变了
2585549898176
>>> a +=
>>> id(a)                   # 地址还是跟上次的地址一样,没有发生变化
2585549898176
>>>

所以在可变对象中 += 也是对原来的内存进行操作,不会导致 id 发生变化

李二蛋 发表于 2022-3-11 22:41:13

qq1151985918 发表于 2022-3-11 21:50
可变容器类例如列表集合字典,请将他们的地址理解为水缸,新增或者删减元素只是往水缸里添水或者从水缸倒水 ...

s=和s = 不同是因为重新赋值么?
那么s = s+和s不同也是因为重新赋值么?不能理解为往原水缸里面加水么?
感谢指教,受益匪浅,

ba21 发表于 2022-3-11 22:43:16

你手上有2个苹果,这2个苹果是一个吗?

李二蛋 发表于 2022-3-11 22:47:33

isdkz 发表于 2022-3-11 22:05
在 python 中 id 用于标识变量的地址,改变了变量的指向,地址变了 id 自然跟着变,

改变变量的指向的操 ...

这是不是就解释了
x =
y =
x is y
False
因为可变序列赋值就会指向新的地址,而不可变序列返回结果就是True指向原来的地址。
好神奇啊,那么这样看来以后做自身加法运算最好用a+=b,这样直接能够在源地址更改,
比新建立个地址更能提高效率。

isdkz 发表于 2022-3-11 23:14:12

李二蛋 发表于 2022-3-11 22:47
这是不是就解释了
x =
y =


只要重新赋值地址就会发生改变(除了常量池里面的值,这个你了解一下就好,如果你对某个变量重新赋值发现它的地址没变,你可以去查一下 python常量池 的内容),

因为赋值操作就是将变量指向值所在的地址的操作,

所以只要重新赋值就会发生地址变化,而对于可变对象来说,+= 并没有改变变量的指向,

要说效率对于计算机来说也差不了多少,就是不需要回收旧的地址

qq1151985918 发表于 2022-3-11 23:48:18

李二蛋 发表于 2022-3-11 22:41
s=和s = 不同是因为重新赋值么?
那么s = s+和s不同也是因为重新赋值么?不能理解为往原水缸里 ...

是的,重新赋值就是新的变量,id指向就会变化。当然我是说可变容器类,如果是数字和字符串,那是不同的。

李二蛋 发表于 2022-3-16 14:45:13

ba21 发表于 2022-3-11 22:43
你手上有2个苹果,这2个苹果是一个吗?

牛逼,一刀见血{:9_232:}
页: [1]
查看完整版本: id()函数相同不同问题