在 python 中测试可变性

testing mutability in python

我正在做一个简单的测试来验证可变性我有一个变量var

我想验证 = 赋值运算符是否更改了我正在做的同一内存位置的值

var = 1

要打印 var 的地址,我会

hex(id(var)) 它给我 '0x1b65158' 然后我分配新值 var = 2 但现在 hex(id(var)) 更改为 '0x1b65140' 如果它正在更改相同的位置它应该是 return 一样,不是吗?请解释

注意:我不想做提到的相同作业 。我试图了解它是如何可变分配的。我并不想在这里创建常量。

这可能有助于您了解正在发生的事情:

In [1]: hex(id(1))                                                                                                                                                                  
Out[1]: '0x109af50a0'

In [2]: hex(id(2))                                                                                                                                                                  
Out[2]: '0x109af50c0'

In [3]: var = 1                                                                                                                                                                     

In [4]: hex(id(var))                                                                                                                                                                
Out[4]: '0x109af50a0'

In [5]: var = 2                                                                                                                                                                     

In [6]: hex(id(var))                                                                                                                                                                
Out[6]: '0x109af50c0'

请注意,id 跟随值而不是变量。

查看 id 内置的文档可能也会有所帮助:

id(object)

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.

当我们写类似 hex(id(var)) 的内容时,我们要求存储在 var.

中的对象地址的十六进制版本

如果我们想测试 var 是否不可变,我们唯一的选择是尝试为其赋值并检查是否发生异常。

事实上,在Python中声明一个不能改变的变量是不可能的。您可以获得的最接近的方法是声明一个 class 的实例,如果您尝试为其属性赋值,该实例将抛出异常。有关这方面的更多信息,请参阅此问题:

How do I create a constant in Python?

Python 的某些实现为 -5 到 256 之间的所有整数保留一个整数对象数组。这意味着当您在该范围内创建一个 int 时,您实际上只是取回对现有对象的引用。

例如:

id(1)
--> 8790876942080
x = 1
id(x)
--> 8790876942080

因此,当您为变量分配新值 12 时,实际上是将引用分配给这些现有对象。

正如我上面提到的,这种行为并不适用于所有整数,例如:

id(5555555555)
--> 89108592
x = 5555555555
id(x)
--> 89109104

您可以在此处阅读更多内容:

  1. ID Function

  2. is Operator