具有指向同一对象的相同值的不同Python变量
在python中,我声明了两个具有相同值的变量。奇怪的是,他们指向同一个物体。我需要了解这些对象及其相应的值是如何分配的具有指向同一对象的相同值的不同Python变量,python,Python,在python中,我声明了两个具有相同值的变量。奇怪的是,他们指向同一个物体。我需要了解这些对象及其相应的值是如何分配的 #!/usr/bin/python a = 100 b = 100 print id(a) print id(b) -------------------- Output : 157375428 157375428 ------------------- 我假设,a和b是两个不同的变量,具有相同的值。那么为什么同一个对象同时指向这两个变量呢?从技术上讲a和b是两个不同
#!/usr/bin/python
a = 100
b = 100
print id(a)
print id(b)
--------------------
Output :
157375428
157375428
-------------------
我假设,a和b是两个不同的变量,具有相同的值。那么为什么同一个对象同时指向这两个变量呢?从技术上讲
a
和b
是两个不同的变量
在Python中,变量只是一个名称。值位于其他位置,变量指的是值
从
对于不可变类型,计算新值的操作实际上可能
返回对具有相同类型和类型的任何现有对象的引用
值,而对于可变对象,这是不允许的。例如,在a=1
之后b=1
,a
和b
可能指的是或可能不是与
值1,具体取决于实现
通过调用
id(a)
您实际上会得到与调用id(100)
时相同的结果,a
和b
共享100
的相同实例。我知道这很令人困惑,几乎所有其他编程语言的行为都不同。也许您不应该将a
和b
看作变量,而是将“命名引用”看作对象。Python预先分配了许多整数(请参阅)。例如,在我的计算机上,我有:
>>> x = 100
>>> y = 100
>>> x is y
True
但是:
事实上,我们可以看到,只有前256个正整数是预先分配的:
>>> x = 0
>>> y = 0
>>> while True:
... if not x is y:
... print x
... break
... x += 1
... y += 1
...
257
要想进一步困惑,请尝试使用
257
。。。嗯…:-)如果id(a)与id(100)相同,考虑到相同的逻辑,“is”运算符将失败。考虑一下这段代码。a=100 b=10打印id(a)打印id(b)b=100打印id(a)打印id(b)如果a为b:打印“True”否则:打印“False”输出:144481220 144480324 144481220 144481220本质上为True,“is”操作符应基于对象执行其操作。但是,如果变量值在任何时候都与任何其他变量相同(如示例中的变量b),则它们都指向相同的对象位置。通过这个“是”运算符,它取决于变量值,而不是对象。is
vs.==
:)“仅前256个整数”-严格来说,-5
到256
包括在内
>>> x = 0
>>> y = 0
>>> while True:
... if not x is y:
... print x
... break
... x += 1
... y += 1
...
257