2024-04-26 05:48:29 发布
网友
我在一个变量中存储一个值,在另一个变量中存储相同的值,然后它为两个变量提供相同的id。但如果我将一个列表分配给一个变量,将同一个列表分配给另一个ID不同的变量,为什么?你知道吗
我的示例程序是:
>>> x=10 >>> y=10 >>> id(x) 21122368 >>> id(y) 21122368 >>> x=[1,2,3] >>> y=[1,2,3] >>> id(x) 35525896 >>> id(y) 35527736
python中缓存了一些不可变的对象,例如一些数字和字符串。这意味着,当您编写1时,您会得到一个对堆上已经存在的对象的引用。你知道吗
1
列表不会被缓存(从它们是可变的这一事实出发,这没有什么意义),因此它们具有不同的标识,尽管它们的内容可以相等。你知道吗
也许比较一下会有帮助。每一个看月亮的人,看到的都是同一个月亮(那就是得到一个1的参照物)。。。所以你可以这么说
id(my_moon) == id(your_moon)
或者只是
my_moon is your_moon
因为月亮就是月亮,而1就是1,一些python实现出于性能原因决定缓存这个对象。你知道吗
另一方面,可变对象是缓存的可怕候选对象。例如,每个人拿一袋薯片,是拿一袋薯片的不同的例子,因此在某个时候可能是这样
my_chips == your_chips
因为他们有相同数量的芯片,但无论如何都不会
id(my_chips) == id(your_chips)
因为这意味着这个对象是共享的,当其他人吃了一个芯片(改变了芯片包对象)时,一个芯片就会从你的包里消失。。。那将是一个可怕的世界:)
这是因为在最流行的Python实现中进行了优化。基本上,小整数不是作为完整对象创建的,而是接收到对现有小整数的引用,每次都是相同的。你知道吗
python中缓存了一些不可变的对象,例如一些数字和字符串。这意味着,当您编写
1
时,您会得到一个对堆上已经存在的对象的引用。你知道吗列表不会被缓存(从它们是可变的这一事实出发,这没有什么意义),因此它们具有不同的标识,尽管它们的内容可以相等。你知道吗
也许比较一下会有帮助。每一个看月亮的人,看到的都是同一个月亮(那就是得到一个
1
的参照物)。。。所以你可以这么说或者只是
因为月亮就是月亮,而
1
就是1
,一些python实现出于性能原因决定缓存这个对象。你知道吗另一方面,可变对象是缓存的可怕候选对象。例如,每个人拿一袋薯片,是拿一袋薯片的不同的例子,因此在某个时候可能是这样
因为他们有相同数量的芯片,但无论如何都不会
id(my_chips) == id(your_chips)
因为这意味着这个对象是共享的,当其他人吃了一个芯片(改变了芯片包对象)时,一个芯片就会从你的包里消失。。。那将是一个可怕的世界:)
这是因为在最流行的Python实现中进行了优化。基本上,小整数不是作为完整对象创建的,而是接收到对现有小整数的引用,每次都是相同的。你知道吗
相关问题 更多 >
编程相关推荐