>>> 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的别名?
根据文件:
当前实现保持整数对象对之间的所有整数数组
-5和256,当您创建在该范围内的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的整数对象数组的范围)?
如果你能解释它,就像你向初学者解释一样,那就更好了.
我有时间使用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) 单元测试模块时遇到了一个令人困惑的问题.该模块实际上是铸造值,我想比较这些值.
是有区别的使用比较==和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
在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) 我(可能是错误的)认为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变量在很大程度上很容易理解,但有一个案例我一直在努力.如果我想将变量指向新的内存地址,我该怎么做?或者,如果Python默认执行此操作(处理指针之类的变量),那么如何将新变量的值字面分配给旧变量的内存地址?
例如,如果我输入
a=1
b=2
c=a
c=b
Run Code Online (Sandbox Code Playgroud)
有什么价值c?它指向什么?是语句代替指针c -> a与指针c -> b或抓住从价值b和覆盖a用b的价值?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) 我认为[无]与[]相同,但在我的测试中,也许有一些东西......
>>>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脚本中,为什么要执行第二个断言(即,将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 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 ×10
python-2.7 ×3
caching ×1
equality ×1
list ×1
numpy ×1
operators ×1
python-3.5 ×1
python-3.x ×1
string ×1
timedelta ×1
types ×1