Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对象的内存分配_Python - Fatal编程技术网

python对象的内存分配

python对象的内存分配,python,Python,我有以下代码: a = 2 b = a a = a + 2 print (a) print (b) 我的问题是为什么b打印为2而不是4?如果你把a分配给b,b不总是引用a的内存吗 谢谢并非所有python对象都是可变的,下面列出了它们的列表 重新分配时,变量将重新分配到新地址: 因为您已经通过x=x+1将x重新分配到一个新位置,这与不变性无关 检查: x = 2 y = x >>> id(x), id(y) (26726784, 26726784) # same 然后,

我有以下代码:

a = 2
b = a

a = a + 2
print (a)
print (b)
我的问题是为什么b打印为2而不是4?如果你把a分配给b,b不总是引用a的内存吗


谢谢

并非所有python对象都是可变的,下面列出了它们的列表


重新分配时,变量将重新分配到新地址:


因为您已经通过x=x+1将x重新分配到一个新位置,这与不变性无关

检查:

x = 2
y = x

>>> id(x), id(y)
(26726784, 26726784) # same
然后,更改此选项:

x = x+1

>>> id(x), id(y)
(26726760, 26726784) # not same, because x reassigned to a new reference location.
如果对可变的列表执行相同的操作,将得到相同的结果:

x=[5]
y=x

>>> id(x), id(y)
(139890260976056, 139890260976056)
派遣时:

x = x + [5]

>>> id(x), id(y)
(139890260094344, 139890260976056) # not same, id reallocated on assignment
>>> x, y
([5, 5], [5])
通过使用x.append5,您将在列表中看到可变行为,其中x和y在修改对象本身时都会发生变化。但在这种情况下,并不是对象的易变性导致了差异。是赋值x=其他东西改变了引用

python中int的一个有趣特性是,较小的int是预先分配的。例如,如果您这样做:

x = 5
y = x
x = 5
id(x) == id(y) # True
x = 5000000000000
y = x
x = 5000000000000 # same as previous.
id(x) == id(y) # False
但是,如果您:

x = 5
y = x
x = 5
id(x) == id(y) # True
x = 5000000000000
y = x
x = 5000000000000 # same as previous.
id(x) == id(y) # False
这是因为小整数有预先分配的位置,而大整数没有。因此,对于大整数的重新分配将找到不同的位置


这验证了@juanpa.arrivillaga的观点,即这是由于赋值而非不变性造成的。

不,Python变量不是内存中的位置。请阅读基本内容,Python不是C。变量不是内存中的位置,赋值和重新赋值与内存分配无关。内存分配是一个骗人的问题。这里的易变性完全无关。@juanpa.arrivillaga这是无关紧要的,但额外的信息是needed@Woody1193不,这完全无关。赋值的语义不会因对象的类型而改变。@juanpa.arrivillaga是正确的,所有对象的赋值都完全相同。@Woody1193用列表试试,你会发现你错了。不是赋值重新分配了内存,从内存分配的角度考虑python变量分配甚至是没有用的,事实上,在这里,在CPython中,所有被引用的对象都已经被分配,没有新的对象被分配created@juanpa.arrivillaga,在中,它解释了id反映了内存中对象的地址。,那么,变量的内存地址没有改变吗?是的,id正好给你一个对象的地址。但您从未创建过任何对象,关键是所有这些都与变量赋值的语义无关,这是这里的基本问题。我的观点是,在CPython中,当解释器启动时,会分配小整数。所有int对象都已分配。内存分配是个麻烦事,Python变量与C变量不同。变量没有被重新分配,变量实际上是dict中的一个键,对象也没有。感谢大家的输入,我显然遗漏了一些东西@南特,你能不能取消接受这个答案,这样我就可以删除它?准确地说,a+2的计算结果是一个对象。它可能与不太可能的对象是同一个对象,但这取决于typea的实现方式。它可能是一个现有的对象CPython,例如,预先分配了介于-5和256之间的int对象,也可能确实是一个当场创建的全新对象。我甚至不会说位置,因为Python没有说明对象是如何实现的。相反,名称x只是绑定到x+1求值的对象,不管该对象可能是什么。通常,x+1与x所指的对象不同,但不一定是新对象。例如,无论出于何种原因,typex.\uuuu add\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。int.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?