gpt4 book ai didi

python - 为什么当我们应用身份运算符时,两个具有完全相同数据的列表在 Python 中显示不同的内存地址?

转载 作者:行者123 更新时间:2023-12-05 03:41:36 27 4
gpt4 key购买 nike

我有两个列表。

list1=["divyansh","jain","python"]
list2=["divyansh","jain","python"]

两个列表具有完全相同的数据。

但是当我们应用 is identity operator 时,它给我们 false 并且内存地址也不同。

我知道在 python 中一切都是对象。如果我声明另一个具有相同数据值的变量,则这两个变量都指向同一个对象。那为什么这在列表数据类型的情况下不起作用。

我知道 python 在运行时为 0 到 255 范围内的 int 值、boolean 值和空 string 分配默认对象。

为什么 list2 指向一些不同的内存地址,而 list1 首先创建时具有完全相同的值?

代码:

x=300
y=300
print("Memory Address of variable x is : ",id(x))
print("Memory Address of variable y is : ",id(y))
print(x is y)
print(x is not y)
list1=["divyansh","jain","python"]
list2=["divyansh","jain","python"]
print("Memory Address of variable list1 is : ",id(list1))
print("Memory Address of variable list2 is : ",id(list2))
print(list1 is list2)
print(list1 is not list2)

Output :
Memory Address of variable x is : 140185049313168
Memory Address of variable y is : 140185049313168
True
False
Memory Address of variable list1 is : 140185048064584
Memory Address of variable list2 is : 140185048053000
False
True

与搜索对象并为其分配相同的内存地址相比,创建对象更耗时且成本更高。我知道对于可变对象是不可能的,将来如果我们更改 list2,list1 数据将受到影响,因此它创建了 diff 对象。但是对于像 int、float、str 这样的基本不可变数据类型,它会分配相同的内存,但是对于像 bytes、tuple、frozenset、complex、range 这样的不可变数据类型,它不会分配相同的内存,尽管它具有相同的数据值。

其他数据类型示例:

tuple1=("divyansh","jain","python")
tuple2=("divyansh","jain","python")
print("Memory Address of variable tuple1 is : ",id(tuple1))
print("Memory Address of variable tuple2 is : ",id(tuple2))
print(tuple1 is tuple2)
print(tuple1 is not tuple2)

bytes1=[1,2,3]
bytes2=[1,2,3]
b1=bytes(bytes1)
b2=bytes(bytes2)
print(type(b1),type(b2))
print(id(b1))
print(id(b2))
print(bytes1 is bytes2)

a=10.5
b=10.5
print(type(a),type(b))
print(id(a))
print(id(b))
print(a is b)

c1=10+20j
c2=10+20j
print(type(c1),type(c2))
print(id(c1))
print(id(c2))
print(c1 is c2)

s1="Dj"
s2="Dj"
print(type(s1),type(s2))
print(id(s1))
print(id(s2))
print(s1 is s2)


f1=frozenset({"Dj"})
f2=frozenset({"Dj"})
print(type(f1),type(f2))
print(id(f1))
print(id(f2))
print(f1 is f2)

r1=range(10)
r2=range(10)
print(type(r1),type(r2))
print(id(r1))
print(id(r2))
print(r1 is r2)

Memory Address of variable tuple1 is : 140088826761792
Memory Address of variable tuple2 is : 140088826762008
False
True
<class 'bytes'> <class 'bytes'>
140088827913280
140088827388192
False
<class 'float'> <class 'float'>
140088827982304
140088827982304
True
<class 'complex'> <class 'complex'>
140088827402864
140088827402896
False
<class 'str'> <class 'str'>
140088826759184
140088826759184
True
<class 'frozenset'> <class 'frozenset'>
140088827366088
140088827365640
False
<class 'range'> <class 'range'>
140088846540448
140088827189840
False

最佳答案

在对象编程的标准情况下:当您创建一个新对象时,语言/计算机会为其保留一个新的内存空间和地址。

在 Python 中,当您创建像列表/容器这样的可变对象时,每个对象都有自己的内存地址。因此,您可以使用它们并修改一个而不修改第二个。这是必要的,如果地址相同,它将是同一个对象,具有两个名称/指针。

这是在不修改另一个的情况下处理 list1 和 list2 的更改所必需的。因为列表是可变对象。

要检查内容身份,您必须检查列表中的每个项目。在 Python 中,“==”运算符用于与数字、列表、元组等进行内容比较,...

它不同于 Python 中的不可变对象(immutable对象)数字。由于它们是不可变的并且永远不会改变,Python 通过在重复使用相同的数字时指向相同的内存地址来优化这一点。 (这是一种单例模式)

之所以做出这种优化选择,是因为每次创建一个新的数字对象都会消耗大量时间和内存。而且内存分配/释放的数量也会太多。

关于python - 为什么当我们应用身份运算符时,两个具有完全相同数据的列表在 Python 中显示不同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67657554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com