相关疑难解决方法(0)

"是"运算符与整数意外行为

为什么以下在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运算符可以区分.为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?

python int identity operators python-internals

476
推荐指数
11
解决办法
6万
查看次数

浅拷贝,深度拷贝和正常分配操作之间究竟有什么区别?

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 copy immutability deep-copy variable-assignment

192
推荐指数
6
解决办法
9万
查看次数

Python多处理——共享id的单独进程中的全局变量?

这个问题我了解到:

当您使用多处理打开第二个进程时,会创建一个全新的 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

4
推荐指数
1
解决办法
2516
查看次数

python 3.6及更早版本与3.7中不可变对象的"is"行为不一致

我被介绍运营商给我的学生时,我注意到,在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版本中是不对的.

有谁知道解释这种新行为的变化是什么?

python internals python-3.x

3
推荐指数
1
解决办法
81
查看次数

了解python id()的唯一性

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 …

python python-3.x

3
推荐指数
1
解决办法
80
查看次数

Python中的对象ID

我们假设我执行以下操作:

>>> id(a)
139926795932424
>>> a
[1, 2, 3, 4]
>>> a = a + [5]
>>> id(a)
Run Code Online (Sandbox Code Playgroud)

这个脚本的最后一行是打印139926795932424吗?或者新的id将被分配给a

python

1
推荐指数
1
解决办法
561
查看次数

如果已经有hash(),为什么在Python中需要id()

id()函数的Python文档说

id(object)返回对象的"标识".这是一个整数,在该生命周期内保证该对象是唯一且恒定的.具有非重叠生存期的两个对象可以具有相同的id()值.

因此,实际上,它保证了作为哈希函数的唯一性,但仅在对象生命周期内,并且没有哈希难以重构的酷事.

为什么要使用id()

python hash objectid

1
推荐指数
1
解决办法
199
查看次数

在python中测试可变性

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

我想验证=赋值运算符是否正在为此更改相同存储位置的值

var = 1

要打印var我的 地址

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

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

python mutable

0
推荐指数
1
解决办法
76
查看次数