Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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,在python中,我声明了两个具有相同值的变量。奇怪的是,他们指向同一个物体。我需要了解这些对象及其相应的值是如何分配的 #!/usr/bin/python a = 100 b = 100 print id(a) print id(b) -------------------- Output : 157375428 157375428 ------------------- 我假设,a和b是两个不同的变量,具有相同的值。那么为什么同一个对象同时指向这两个变量呢?从技术上讲a和b是两个不同

在python中,我声明了两个具有相同值的变量。奇怪的是,他们指向同一个物体。我需要了解这些对象及其相应的值是如何分配的

#!/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