在 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
因此,当您为变量分配新值 1
或 2
时,实际上是将引用分配给这些现有对象。
正如我上面提到的,这种行为并不适用于所有整数,例如:
id(5555555555)
--> 89108592
x = 5555555555
id(x)
--> 89109104
您可以在此处阅读更多内容:
ID Function
is Operator
我正在做一个简单的测试来验证可变性我有一个变量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
因此,当您为变量分配新值 1
或 2
时,实际上是将引用分配给这些现有对象。
正如我上面提到的,这种行为并不适用于所有整数,例如:
id(5555555555)
--> 89108592
x = 5555555555
id(x)
--> 89109104
您可以在此处阅读更多内容:
ID Function
is Operator