相关疑难解决方法(0)

在Python(2.7)中,为什么os.remove与os.unlink不相同?

>>> import sys
>>> sys.version
'2.7.3 (default, Mar 13 2014, 11:03:55) \n[GCC 4.7.2]'
>>> import os
>>> os.remove is os.unlink
False
>>> os.remove == os.unlink
True
Run Code Online (Sandbox Code Playgroud)

这是为什么?是不是os.unlink应该是os.remove的别名?

python object-identity python-2.7 object-equality

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

将两个变量与'is'运算符进行比较,这些运算符在Python中的一行中声明

根据文件:

当前实现保持整数对象对之间的所有整数数组-5256,当您创建在该范围内的int你其实只是回到现有对象的引用.所以应该可以改变它的值1.我怀疑在这种情况下Python的行为是未定义的.:-)

所以以下行为是正常的.

>>> a = 256
>>> b = 256
>>> a is b
True
>>> c = 257
>>> d = 257
>>> c is d
False
Run Code Online (Sandbox Code Playgroud)

但是当我宣布这样的两个变量时,我变得正确 -

>>> e = 258; f=258;
>>> e is f
True
Run Code Online (Sandbox Code Playgroud)

我检查了e和f-引用的对象的身份

>>> id(e)
43054020
>>> id(f)
43054020
Run Code Online (Sandbox Code Playgroud)

他们是一样的.

我的问题是当我们用分号分隔e和f时发生了什么?为什么它们引用同一个对象(尽管这些值超出了Python的整数对象数组的范围)?

如果你能解释它,就像你向初学者解释一样,那就更好了.

python python-2.7

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

numpy.longdouble dtype的timedelta错误

我有时间使用dtype numpy.longdouble,当我试图将这些值与timedelta函数一起使用时,我遇到了错误.但是当我把它转换成numpy.float64一切都很好.有人可以解释一下这种行为吗?

import numpy as np
from datetime import timedelta
t1 = np.array([1000], dtype=np.longdouble)
t2 = np.array([1000], dtype=np.float64)

In [166]: timedelta(seconds=t1[0])
TypeError: unsupported type for timedelta seconds component: numpy.float64

In [167]: timedelta(seconds=t2[0])
Out[167]: datetime.timedelta(0, 1000)

In [168]: timedelta(seconds=t1[0].astype(np.float64))
Out[168]: datetime.timedelta(0, 1000)
Run Code Online (Sandbox Code Playgroud)

当我试图看到变量的dtypes时,它们看起来相似但不相同:

In [172]: t1[0].dtype
Out[172]: dtype('float64')

In [173]: t2[0].dtype
Out[173]: dtype('float64')

In [174]: np.longdouble == np.float64
Out[174]: False

In [175]: t1[0].dtype == t2[0].dtype
Out[175]: True
Run Code Online (Sandbox Code Playgroud)

编辑

奇怪的是,它不适用于np.int32和np.int64:

t3 = np.array([1000], dtype=np.int32)
t4 = np.array([1000], …
Run Code Online (Sandbox Code Playgroud)

python types numpy timedelta python-datetime

9
推荐指数
2
解决办法
5147
查看次数

'is'运算符与浮点数意外地表现

单元测试模块时遇到了一个令人困惑的问题.该模块实际上是铸造值,我想比较这些值.

是有区别的使用比较==is(部分,我小心的区别)

>>> 0.0 is 0.0
True   # as expected
>>> float(0.0) is 0.0
True   # as expected
Run Code Online (Sandbox Code Playgroud)

正如预期到现在,但这是我的"问题":

>>> float(0) is 0.0
False
>>> float(0) is float(0)
False
Run Code Online (Sandbox Code Playgroud)

为什么?至少最后一个对我来说真的很困惑.内部表示float(0)float(0.0)应该是平等的.与之比较==正如预期的那样.

python floating-point python-2.7 python-3.x python-internals

9
推荐指数
2
解决办法
797
查看次数

Python在交互模式下不是实习字符串?

在Python交互式会话中:

In [1]: a = "my string"

In [2]: b = "my string"

In [3]: a == b
Out[3]: True

In [4]: a is b
Out[4]: False

In [5]: import sys

In [6]: print(sys.version)
3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609]
Run Code Online (Sandbox Code Playgroud)

另一方面,运行以下程序时:

#!/usr/bin/env python

import sys


def test():
    a = "my string"
    b = "my string"
    print(a == b)
    print(a is b)


if __name__ == "__main__":
    test()
    print(sys.version)
Run Code Online (Sandbox Code Playgroud)

输出是:

True
True
3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC …
Run Code Online (Sandbox Code Playgroud)

python string equality python-3.5

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

"是"运算符在Python中做了什么?

我(可能是错误的)认为is运算符正在进行id()比较.

>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)

然而,val is not None看起来它并不那么简单.

>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True
Run Code Online (Sandbox Code Playgroud)

然后,'是'运营商做了什么?它只是我推测的对象id比较吗?如果是这样,val is not None在Python中被解释为not (val is None)

python operators

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

在Python中,如果我输入a = 1 b = 2 c = ac = b,c的值是多少?c指向什么?

Python变量在很大程度上很容易理解,但有一个案例我一直在努力.如果我想将变量指向新的内存地址,我该怎么做?或者,如果Python默认执行此操作(处理指针之类的变量),那么如何将新变量的值字面分配给旧变量的内存地址?

例如,如果我输入

a=1
b=2
c=a
c=b
Run Code Online (Sandbox Code Playgroud)

有什么价值c?它指向什么?是语句代替指针c -> a与指针c -> b或抓住从价值b和覆盖ab的价值?c=b很暧昧.

换句话说,如果你从这开始:

a -> 1 <- c
b -> 2
Run Code Online (Sandbox Code Playgroud)

它重新指向c这样:

a -> 1    _c
b -> 2 <-/
Run Code Online (Sandbox Code Playgroud)

b像这样复制?

a -> 2 <- c
b -> 2
Run Code Online (Sandbox Code Playgroud)

python

7
推荐指数
3
解决办法
1647
查看次数

python中[None]和[]之间的区别是什么?

我认为[无]与[]相同,但在我的测试中,也许有一些东西......

>>>print len([])
0
>>>print len([None])
1
Run Code Online (Sandbox Code Playgroud)

我什么时候应该使用None?和[]

还有一个有趣的问题

>>>c= []
>>>d= []
>>>print c is d
False
>>>a= 1
>>>b=1
print a is b
True
Run Code Online (Sandbox Code Playgroud)

为什么空列表的ID授予不同?

python list

6
推荐指数
1
解决办法
2万
查看次数

Python整数缓存

在下面的python脚本中,为什么要执行第二个断言(即,将0加到257并将结果存储在y中,则x和y成为不同的对象)?谢谢!

x = 257
y = 257
assert x is y

x = 257            
y = 257 + 0
assert x is not y
Run Code Online (Sandbox Code Playgroud)

python caching

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

为什么从字符串转换的python float与具有相同值的普通float相同?

我在Python 3.6.5中遇到了一个奇怪的现象:虽然它们彼此相等但float('50.0')不一样.float(50.0)

我运行了一些代码来找到差异.除了python说他们不一样,我找不到区别.我很困惑.如果有人能解释这里发生的事情,我会喜欢它.

这是我的测试:

if float('50.0') is float(50.0):
    print("float('50.0') is float(50.0)")
else:
    print("float('50.0') is not float(50.0)")

if float('50.0') == float(50.0):
    print("float('50.0') == float(50.0)")
else:
    print("float('50.0') != float(50.0)")

if float('50.0') is 50.0:
    print("float('50.0') is 50.0")
else:
    print("float('50.0') is not 50.0")

if float(50.0) is 50.0:
    print('float(50.0) is 50.0')
else:
    print('float(50.0) is not 50.0')

if float(50.0) is float(50.0):
    print('float(50.0) is float(50.0)')
else:
    print('float(50.0) is not float(50.0)')

xstr_float = float('50.0')
norm_float = float(50.0)
print ('xstr_float: {0:.100f}'.format(xstr_float))
print ('xstr_float is …
Run Code Online (Sandbox Code Playgroud)

python

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