为什么以下在Python中出现意外行为?
>>> a = 256
>>> b = 256
>>> a is b
True # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False # What happened here? Why is this False?
>>> 257 is 257
True # Yet the literal numbers compare properly
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 2.5.2.尝试一些不同版本的Python,似乎Python 2.3.3显示了99到100之间的上述行为.
基于以上所述,我可以假设Python在内部实现,使得"小"整数以不同于大整数的方式存储,is运算符可以区分.为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?
import copy
a = "deepak"
b = 1, 2, 3, 4
c = [1, 2, 3, 4]
d = {1: 10, 2: 20, 3: 30}
a1 = copy.copy(a)
b1 = copy.copy(b)
c1 = copy.copy(c)
d1 = copy.copy(d)
print("immutable - id(a)==id(a1)", id(a) == id(a1))
print("immutable - id(b)==id(b1)", id(b) == id(b1))
print("mutable - id(c)==id(c1)", id(c) == id(c1))
print("mutable - id(d)==id(d1)", id(d) == id(d1))
Run Code Online (Sandbox Code Playgroud)
我得到以下结果 -
immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False
Run Code Online (Sandbox Code Playgroud)
如果我进行深度扫描 …
从这个问题我了解到:
当您使用多处理打开第二个进程时,会创建一个全新的 Python 实例,具有自己的全局状态。该全局状态不共享,因此子进程对全局变量所做的更改对于父进程来说是不可见的。
为了验证这种行为,我制作了一个测试脚本:
import time
import multiprocessing as mp
from multiprocessing import Pool
x = [0] # global
def worker(c):
if c == 1: # wait for proc 2 to finish; is global x overwritten by now?
time.sleep(2)
print('enter: x =', x, 'with id', id(x), 'in proc', mp.current_process())
x[0] = c
print('exit: x =', x, 'with id', id(x), 'in proc', mp.current_process())
return x[0]
pool = Pool(processes=2)
x_vals = pool.map(worker, [1, 2])
print('parent: x =', x, 'with …Run Code Online (Sandbox Code Playgroud) python parallel-processing multiprocessing python-multiprocessing
我被介绍是运营商给我的学生时,我注意到,在Python(3.6版以上)和(3.7版)之间的行为不一致.
启动python shell并运行:
5/2 is 2.5
Run Code Online (Sandbox Code Playgroud)
要么:
(1, 2, 3) is (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
在v3.6.X中,你得到False了两者,但在v3.7中他们结果是True.
我的期望是结果应该是True,因为我认为不可变数字对象(或它们的元组)只有一个实例.
似乎至少我的想法在以前的Python版本中是不对的.
有谁知道解释这种新行为的变化是什么?
id()功能的Python文档指出以下内容:
这是一个整数,可以保证在此对象的生存期内唯一且恒定。具有不重叠生命周期的两个对象可能具有相同的
id()值。CPython实现细节:这是对象在内存中的地址。
虽然,下面的代码片段显示了id重复的。由于我没有明确del显示对象,因此我假设它们都是活动的并且是唯一的(我不知道不重叠的含义)。
>>> g = [0, 1, 0]
>>> for h in g:
... print(h, id(h))
...
0 10915712
1 10915744
0 10915712
>>> a=0
>>> b=1
>>> c=0
>>> d=[a, b,c]
>>> for e in d:
... print(e, id(e))
...
0 10915712
1 10915744
0 10915712
>>> id(a)
10915712
>>> id(b)
10915744
>>> id(c)
10915712
>>>
Run Code Online (Sandbox Code Playgroud)
id不同对象的值如何相同?是因为值0(class的对象int)是一个常量并且解释器/ C编译器进行了优化吗?
如果我要这样做a = c,那么我理解c …
我们假设我执行以下操作:
>>> id(a)
139926795932424
>>> a
[1, 2, 3, 4]
>>> a = a + [5]
>>> id(a)
Run Code Online (Sandbox Code Playgroud)
这个脚本的最后一行是打印139926795932424吗?或者新的id将被分配给a?
该id()函数的Python文档说
id(object)返回对象的"标识".这是一个整数,在该生命周期内保证该对象是唯一且恒定的.具有非重叠生存期的两个对象可以具有相同的id()值.
因此,实际上,它保证了作为哈希函数的唯一性,但仅在对象生命周期内,并且没有哈希难以重构的酷事.
为什么要使用id()?
我正在做一个简单的测试以验证可变性我有一个变量 var
我想验证=赋值运算符是否正在为此更改相同存储位置的值
var = 1
要打印var我的 地址
hex(id(var))它给了我'0x1b65158'然后我分配了新值,var = 2但现在hex(id(var))更改为'0x1b65140'如果它更改了相同的位置,应该返回相同的值吗?请解释
注意:我不想做这里提到的相同任务。我试图了解它是如何可变分配的。而且我不想在这里创建常量。