Tag: python internals

Python中的两个variables具有相同的id,但不包含列表或元组

Python中的两个variables具有相同的id : a = 10 b = 10 a is b >>> True 如果我拿两个list : a = [1, 2, 3] b = [1, 2, 3] a is b >>> False 根据这个链接 Senderle回答说,不可变的对象引用有相同的ID和可变的对象像列表有不同的ID。 所以现在根据他的回答,元组应该有相同的ID – 意思是: a = (1, 2, 3) b = (1, 2, 3) a is b >>> False 理想情况下,因为元组不可变,所以它应该返回True ,但是它返回False ! 什么是解释?

Python中x ='y''z'的底层是什么?

如果在Python中运行x = 'y' 'z' ,则会将x设置为'yz' ,这意味着当Python看到多个string相邻时,会发生某种string连接。 但是这是什么样的级联? 它实际上是运行'y' + 'z'还是运行''.join('y','z')还是其他的?

“是”运算符的行为意外与非caching整数

在和Python解释器一起玩时,我偶然发现了关于is运算符的这个矛盾的例子: 如果评估发生在函数中,则返回True ,否则返回False 。 >>> def func(): … a = 1000 … b = 1000 … return a is b … >>> a = 1000 >>> b = 1000 >>> a is b, func() (False, True) 由于is运算符为所涉及的对象计算id() ,这意味着a和b在函数func声明时指向同一个int实例,但是相反,它们指向不在其外的对象。 这是为什么? 注意 :我了解了Python的“is”运算符中所描述的identity( is )和equality( == )运算之间的区别。 另外,我也意识到python正在执行的范围[-5, 256]的整数的caching,正如“is”中所描述的那样,整个操作符的行为意外 。 这不是这种情况,因为这些数字超出了这个范围, 我想要评估身份而不是平等。

使用id()时,和list()之间有区别吗?

有人可以解释以下吗? 为什么id相同,但是列表不同? >>> [] is [] False >>> id([]) == id([]) True 列表创build有区别吗? >>> id(list()) == id(list()) False >>> id([]) == id([]) True 为什么发生这种情况? 我得到两个不同的名单。 为什么不只一个,或三个或更多? >>> [].__repr__ <method-wrapper '__repr__' of list object at 0x7fd2be868128> >>> [].__repr__ <method-wrapper '__repr__' of list object at 0x7fd2be868170> >>> [].__repr__ <method-wrapper '__repr__' of list object at 0x7fd2be868128> >>> [].__repr__ […]

为什么在Python中颠倒和sorting不同的types?

reversed的types是“type”: >>> type(reversed) <class 'type'> sorted的types是“内build函数或方法”: >>> type(sorted) <class 'builtin_function_or_method'> 但是,它们本质上看起来是一样的。 排除function上的明显差异(反转与sorting顺序),这种差异在实现中的原因是什么?

Python中的__weakref__究竟是什么?

令人惊讶的是, __weakref__没有明确的文档。 在这里解释弱引用。 __weakref__在__slots__的文档中也很快提到。 但是我找不到关于__weakref__本身的任何内容。 什么是__weakref__ ? – 它只是一个作为旗帜的成员:如果存在,对象可能被弱引用? – 或者它是一个函数/variables,可以被覆盖/分配来获得所需的行为? 怎么样?

为什么“假是假的”是“真”呢?

为什么在Python中这样评估: >>> False is False is False True 但是当用括号试图performance如预期的时候: >>> (False is False) is False False

在Python中提高超大字典的性能

我发现,如果我在开头初始化一个空字典,然后在for循环中添加元素到字典中(大约110,000个键,每个键的值是一个列表,循环中也增加),速度降低为for循环去。 我怀疑问题是,字典在初始化时并不知道密钥的数量,而且它并没有做一些非常聪明的事情,所以也许存储冲突变得相当频繁,并且速度变慢了。 如果我知道键的数量,确切地说是那些键,是否有任何方式在Python中使字典(或哈希表)更有效地工作? 我隐约记得,如果你知道密钥,你可以巧妙地devise哈希函数(完美哈希?),并预先分配空间。

为什么范围(0)==范围(2,2,2)在Python 3中为True?

为什么在Python 3中,使用不同的值进行初始化的范围比较相等? 当我在我的解释器中执行以下命令时: >>> r1 = range(0) >>> r2 = range(2, 2, 2) >>> r1 == r2 True 结果是True 。 这是为什么? 为什么具有不同参数值的两个不同的range对象被视为相等?

len()关于集合和列表的复杂性

len()关于集合和列表的复杂性同样是O(1)。 为什么需要更多的时间来处理集合? ~$ python -m timeit "a=[1,2,3,4,5,6,7,8,9,10];len(a)" 10000000 loops, best of 3: 0.168 usec per loop ~$ python -m timeit "a={1,2,3,4,5,6,7,8,9,10};len(a)" 1000000 loops, best of 3: 0.375 usec per loop 它是否与特定的基准相关,比如,构build集比构build列表需要更多的时间,并且基准也考虑到了这一点? 如果创build一个集合对象比创build一个列表需要更多的时间,那么根本原因是什么?