Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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/7/wcf/4.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=1 B=1 A is B #output is True 第二种情况 A=[1] B=[1] A is B #output is false 我知道list是一种按引用的数据类型,因此第二种情况是有意义的。但我不明白为什么第一个场景的输出是真的。整数的内存位置应该不同,对吗?或者如果值相似,它是否指向相同的位置?比较2个整数的内存地址时,您可以看到它们存储在相同的位置: x = 1 y = 1 print(id(x) == id(y)) 但是,当我们编辑其中一个变量时 x

第一种情况

A=1
B=1
A is B #output is True
第二种情况

A=[1]
B=[1]
A is B #output is false

我知道
list
是一种按引用的数据类型,因此第二种情况是有意义的。但我不明白为什么第一个场景的输出是真的。整数的内存位置应该不同,对吗?或者如果值相似,它是否指向相同的位置?

比较2个整数的内存地址时,您可以看到它们存储在相同的位置:

x = 1
y = 1
print(id(x) == id(y))
但是,当我们编辑其中一个变量时

x = 1
y = 1
x += 1
print(id(x) == id(y))
如图所示。python解释器缓存从-5到256的整数。这样,所有在此范围内的变量都将指向这些内存地址。但是,如果变量发生变化,它将不再指向这些地址。例如:

a = 256; 
b = 256;
print(id(a) == id(b))
c = 257;
d = 257;
print(id(c) == id(d))

然而,我看到一些在线python解释器对这两种解释器都返回True。

对于列表,您是True

对于整数部分,《语言参考手册》说这是一个实现细节:

a=1后;b=1,a和b可能引用值为1的同一对象,也可能不引用,具体取决于实现

在CPython参考实现中,
a是b
是真的,因为:

当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用


对于缓存范围之外的整数,il可能取决于您是处于即时模式还是编译模式:如果Python可以立即看到完整的模块,它可能会使用优化使
a
b
引用它所属的同一对象,但不会改变行为。但是,由于这些只是实现细节,所以对于非引用类型,您永远不应该依赖两个标识符共享或不是同一对象。

这与按引用/按值无关。在第一种情况下,
A
B
都指向内存中的同一对象-
1
。这是可能的,因为Python中有一些整数的缓存。在第二段代码中,您创建了两个不同的列表(尽管它们的内容相同)显然,
A
B
没有指向同一个对象……在python中,每件事都是对象,因为整数也被视为对象,所以它被存储在池内存中,所以如果下一个变量被赋予相同的值,它们都指向池内存中的相同值,这就是为什么比较整数返回true。我强烈建议不要使用IS来比较整数值。看看这个,这能回答你的问题吗?谢谢。请记住,在看到这篇文章后,您可能想更改您的答案。谢谢,我在我的答案中添加了一些澄清。谢谢。帮了很多忙,谢谢。帮了很多忙
False
a = 256; 
b = 256;
print(id(a) == id(b))
c = 257;
d = 257;
print(id(c) == id(d))
True
False