Tag: python internals

为什么'()is()'在'为'时返回True,'{}是{'是'返回False?

从我已经知道,使用[], {}或()来实例化对象返回一个新的list, dict或tuple实例; 一个具有新身份的新实例对象。 这是相当清楚的,直到我真正testing它,我注意到() is ()实际上返回True而不是预期的False : >>> () is (), [] is [], {} is {} (True, False, False) 如预期的那样,这种行为在分别使用list() , dict()和tuple()创build对象时也performance出来: >>> tuple() is tuple(), list() is list(), dict() is dict() (True, False, False) 我可以在tuple()的文档中find唯一相关的信息: […]例如, tuple('abc')返回('a', 'b', 'c')和tuple([1, 2, 3])返回(1, 2, 3) 。 如果没有参数,构造函数将创build一个新的空元组() 。 我只想说,这还不足以回答我的问题。 那么,为什么空元组具有相同的身份,而其他的如列表或字典不是?

Python的关机程序在哪里被logging?

CPython有一个奇怪的行为,在关机期间将模块设置为None。 这closures了我写的一些multithreading代码closures时的错误日志logging。 我无法find这种行为的任何文件。 在PEP 432中提到: […]显着减less将经历“模块全局设置为无”行为的模块的数量,该行为被用于审议中断周期并试图干净地释放更多的外部资源。 有关于此行为的SO问题 , C API文档提到了embedded式解释器的closures行为 。 我还在python-dev和相关的CPython bug中find了相关的线程 : 这个补丁不会改变模块对象在解除分配后立即清除其全局variables字典的行为。 这种行为在哪里logging? 是Python 2具体吗?

在Python中如何引用variables

这个消息有很多例子,但是我希望它能帮助我和其他人更好地理解Python 2.7中variables和属性查找的全部内容。 我正在使用PEP 227( http://www.python.org/dev/peps/pep-0227/ )中的代码块(如模块,类定义,函数定义等)和variables绑定(例如作为赋值,参数声明,类和函数声明,for循环等) 我使用的术语variables的名称,可以被称为没有点,名称的属性需要与对象名称限定(如obj.x为对象obj的属性x)。 在Python中有三个代码块的作用域,但是函数: 本地 全球 内build Python中只有四个块用于function(根据PEP 227): 本地 围绕function 全球 内build 将variables绑定到块中并find它的规则非常简单: 除非variables被声明为全局variables(在这种情况下variables属于全局variables),否则variables与块中某个对象的任何绑定都会使该variables局部于该块中, 对所有块使用规则LGB(local,global,builtin)查找对variables的引用,但是函数 只有函数使用规则LEGB(local,enclosing,global,builtin)来查找对variables的引用。 举个例子来validation这个规则,并且展示很多特例。 对于每个例子,我会给我的理解。 如果我错了,请纠正我。 对于最后一个例子,我不了解结果。 例1: x = "x in module" class A(): print "A: " + x #x in module x = "x in class A" print locals() class B(): print "B: " + […]

“from __future__ import braces”代码在哪里?

我想知道什么是在命令上执行的代码: >>> from __future__ import braces SyntaxError: not a chance 所以,由于python是开源的,我打开C:\Python27\Lib\__future__.py并查找。 令人惊讶的是,我发现那里没有处理导入braces模块。 所以,我的问题是,处理这个代码在哪里? 当我运行这个命令时会发生什么?

运营商的非常奇怪的行为是与方法

为什么第一个结果是False ,如果不是True ? >>> from collections import OrderedDict >>> OrderedDict.__repr__ is OrderedDict.__repr__ False >>> dict.__repr__ is dict.__repr__ True

为什么硬编码这个列表比计算慢呢?

我想把这个序列的前1024个项分配给一个列表。 我最初猜测,这个列表硬编码将是最快的方法。 我也尝试algorithm生成列表,发现这比硬编码更快。 因此,我testing了各种折衷办法,使用越来越长的硬编码列表和algorithm扩展到1024个项目。 我发现最快的方法是对128个项目进行硬编码,然后生成剩下的项目。 我想了解为什么硬编码序列中的前128个项目,并计算其余的比硬编码所有1024个项目更快。 代码和configuration文件结果如下所示,使用Python 3.4.2 Shell( IDLE )和cProfile timeit ( 感谢Veedrac对于改进的分析代码的回答 )。 我已经把硬编码列表放在一行很长的一行,以避免与行数混淆的问题,但除此之外代码不需要水平滚动。 码 def hardcoded(): m = [0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,9,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,10] def softcoded(): m = [0] for k in range(10): m += m m[-1] += 1 def hybrid(): m = [0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7] for k in range(3): m += m m[-1] += 1 from timeit import […]

为什么从列表中创build列表使其变大?

我在使用sys.getsizeof时应该看到一些不一致的sys.getsizeof 。 (Python 2.7.5) >>> lst = [0,1,2,3,4,5,6,7,8,9] >>> sys.getsizeof(lst) 76 >>> lst2 = list(lst) >>> sys.getsizeof(lst2) 104 >>> lst3 = list(lst2) >>> sys.getsizeof(lst3) 104 >>> sys.getsizeof(lst[:]) 76 >>> sys.getsizeof(lst2[:]) 76 有人有简单的解释吗?

为什么variables1 + =variables2比variables1 =variables1 +variables2快得多?

我已经inheritance了一些Python代码,用于创build巨大的表(最多19列5000行)。 桌子在屏幕上画了九秒 。 我注意到每行都是使用这个代码添加的: sTable = sTable + '\n' + GetRow() 其中sTable是一个string。 我改变了: sTable += '\n' + GetRow() 我注意到桌子现在出现在六秒钟内 。 然后我改变它: sTable += '\n%s' % GetRow() 基于这些Python性能提示 (仍然是六秒钟)。 由于这被称为约5000次,它突出了性能问题。 但为什么会有这么大的差别呢? 为什么编译器没有在第一个版本中发现问题并对其进行优化?

设置文字给出了设置函数调用的不同结果

为什么set函数会调用dupe,但是parsingset literal却不行? >>> x = Decimal('0') >>> y = complex(0,0) >>> set([0, x, y]) {0} >>> {0, x, y} {Decimal('0'), 0j} (Python 2.7.12。可能与这个类似的问题相同的根本原因)

什么是正确的方式来覆盖Python中的对象的复制/深层拷贝操作?

所以,为了build立起来,我觉得我理解copy模块和copy.copy模块之间的差异,并且在成功之前使用了copy.copy和copy.deepcopy ,但是这是我第一次实际上重载__copy__和__deepcopy__方法。 我已经search了__copy__ ,查看了内置的Python模块来查找__copy__和__deepcopy__函数(例如sets.py , decimal.py和fractions.py )的实例,但是我仍然不能100%确定我说得对。 这是我的场景: 我有一个configuration对象,主要是由简单的属性组成(尽pipe它可能会有其他非原始对象的列表)。 最初,我将使用默认的一组值来实例化一个configuration对象。 该configuration将被交给多个其他对象(以确保所有对象以相同的configuration启动)。 但是,一旦用户交互开始,每个对象都需要能够独立地调整configuration,而不会影响对方的configuration(这对我说,我需要对我的初始configuration进行更深入的处理)。 这是一个示例对象: class ChartConfig(object): def __init__(self): #Drawing properties (Booleans/strings) self.antialiased = None self.plot_style = None self.plot_title = None self.autoscale = None #X axis properties (strings/ints) self.xaxis_title = None self.xaxis_tick_rotation = None self.xaxis_tick_align = None #Y axis properties (strings/ints) self.yaxis_title = None self.yaxis_tick_rotation = None […]