首页 > TAG信息列表 > python-internals

Python,内置id()的对象方法是什么?

在Python中: > len(a)可以替换为a .__ len __() > str(a)或repr(a)可以用a .__ str __()或a .__ repr __()代替> ==是__eq__,是__add__,等等. 有类似的方法来获取id(a)吗?如果没有,是否有任何解决方法可以在不使用id()的情况下获取python对象的唯一ID? 编辑:附加问题:如果不是?有什么理由

Python中foo .__ x__和x(foo)的原因(即len和__len__)

直观地讲,List类应该实现一个属性或方法来检索实例的长度.幸运的是,Python列表中有一个名为__len__的隐藏方法.不幸的是,这种方法不能直接使用.相反,我应该使用将为我读取隐藏方法的外部函数. 就像我需要请其他人打开冰箱为我喝啤酒一样.啤酒在冰箱里,我双手都可以,我应该可以自己

python中生成器对象的大小

对于以下代码: import sys x=(i for i in range(1,11)) print x print 'Before starting iterating generator size is' ,sys.getsizeof(x) print 'For first time' for i in x: print i print 'For second time , does not print anything'

open()中的整数文件描述符“0” – Python 3

在Python 3中,可以使用以下格式的open a file object using an “integer file descriptor”: stdout = open(1, "w") stdout.write("Hello World") # Prints Hello World stdout.close() 虽然,有趣的是,我发现0也是一个有效的流. 如果我把它放在文件testio.py中: stdout = open(0

为什么Python的`lambda`表达式中不允许赋值?

这不是Assignment inside lambda expression in Python的重复,也就是说,我不会问如何欺骗Python在lambda表达式中赋值. 我有一些λ演算背景.考虑以下代码,它 看起来Python非常愿意在lambda中执行副作用表情: #!/usr/bin/python def applyTo42(f): return f(42) def double(x)

python – 为什么代码使用中间变量比没有代码更快?

我遇到了这种奇怪的行为并且无法解释它.这些是基准: py -3 -m timeit "tuple(range(2000)) == tuple(range(2000))" 10000 loops, best of 3: 97.7 usec per loop py -3 -m timeit "a = tuple(range(2000)); b = tuple(range(2000)); a==b" 10000 loops, best of 3: 70.7 usec

Python 2假定了不同的源代码编码

我注意到,如果没有源代码编码声明,Python 2解释器假定源代码使用脚本和标准输入以ASCII编码: $python test.py # where test.py holds the line: print u'é' File "test.py", line 1 SyntaxError: Non-ASCII character '\xc3' in file test.py on line 1, but no encoding dec

在python中比较两个字符串时会发生什么

比较python中的字符串时,例如 if "Hello" == "Hello": #execute certain code 我很好奇比较字符串的代码是什么.因此,如果我在c中比较这些,我会比较每个角色,并在一个角色不匹配时中断.我想知道比较这样的两个字符串的过程是什么,即什么时候它会中断,如果这个比较和上面说的

为什么Python的’len’函数比__len__方法更快?

在Python中,len是一个函数,通过调用对象的__len__方法来获取集合的长度: def len(x): return x.__len__() 所以我希望__len __()的直接调用至少和len()一样快. import timeit setup = ''' ''' print (timeit.Timer('a="12345"; x=a.__len__()', setup=setu

python – 为什么元组在内存中占用的空间少于列表?

元组在Python中占用更少的内存空间: >>> a = (1,2,3) >>> a.__sizeof__() 48 而列表需要更多的内存空间: >>> b = [1,2,3] >>> b.__sizeof__() 64 Python内存管理内部会发生什么?解决方法:我假设您正在使用CPython和64位(我在CPython 2.7 64位上获得了相同的结果).在其他Python实

Python字符串文字串联

我可以使用以下语法创建多行字符串: string = str("Some chars " "Some more chars") 这将产生以下字符串: "Some chars Some more chars" Python是加入这两个单独的字符串还是编辑器/编译器将它们视为单个字符串? P.s:我只是想了解内部情况.我知道还有其他方法来声明或创

python – 为什么两个相同的列表具有不同的内存占用?

我创建了两个列表l1和l2,但每个列表都有不同的创建方法: import sys l1 = [None] * 10 l2 = [None for _ in range(10)] print('Size of l1 =', sys.getsizeof(l1)) print('Size of l2 =', sys.getsizeof(l2)) 但输出让我感到惊讶: Size of l1 = 144 Size of l2 = 192 使用列表

在python3.6中,集合的顺序是像dicts一样

由于Python 3.6中dict实现的更改,现在默认排序.现在也设置保留顺序吗? 我找不到任何关于它的信息,但由于这两种数据结构在它们工作的方式非常相似,我认为可能就是这种情况. 我知道在所有情况下都没有订购dicts的承诺,但它们大部分时间都是如此.如Python文档中所述: The order-prese

带有空格的Python字符串,最后没有空格和不变性

我了解到在一些不可变类中,__ new__可能会返回一个现有实例 – 这就是int,str和tuple类型有时对小值进行的操作. 但为什么以下两个片段的行为不同? 最后有一个空格: >>> a = 'string ' >>> b = 'string ' >>> a is b False 没有空间: >>> c = 'string' >>> d = &#

python – 为什么类的主体在定义时被执行?

与函数相反,类的主体在定义时执行: class A(object): print 'hello' 日期: hello 为什么会这样?它与@classmethod / @staticmethod方法和类属性有关吗?解决方法:当Python首次导入模块时,一切都在模块级执行.函数体(和生成器表达式主体)在这里是例外,而不是规则. Python执行所有

python – 解释器维护的整数缓存是什么?

深入研究Python的源代码后,我发现它维护了一个PyInt_Objects数组,范围从int(-5)到int(256)(@src / Objects / intobject.c) 一个小实验证明了这一点: >>> a = 1 >>> b = 1 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False 但是如果我在py文件中一起运行这些代

python – 为什么我不能使用inspect.getsource()来查看列表的来源?

我试图使用inspect模块检索列表类的源代码,但没有成功: >>> import inspect >>> inspect.getsource(list) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/inspect.py", line 701, in gets

Python如何区分显式传递None作为内置函数中的参数

我试验了下一个代码: >>> f = object() # It's obvious behavior: >>> f.foo Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute '

为什么Python的语法规范不包含文档字符串和注释?

我正在咨询官方Python grammar specification as of Python 3.6. 我无法找到任何注释语法(它们显示在#前面)和文档字符串(它们应显示为”’).快速查看the lexical analysis页面也无济于事 – docstrings在那里被定义为longstrings但没有出现在语法规范中.名为STRING的类型会进一步

为什么python dict更新疯狂?

我有一个python程序,它从文件中读取行并将它们放入dict中,简单来说,它看起来像: data = {'file_name':''} with open('file_name') as in_fd: for line in in_fd: data['file_name'] += line 我发现它需要几个小时才能完成. 然后,我对程序做了一些改动: data = {'file

为什么Python使用异常来管理迭代器,为什么不使用其他语言?

在Java中,迭代器有一个hasNext()方法(如果我没记错的话 – 自从我用Java编程以来已经很长时间了,所以细节可能会关闭).当您单步执行迭代器时,查询hasNext()以查看是否应该停止. 在Python中,没有hasNext(),并且当迭代器想要发出应该停止的信号时,它会引发StopIteration异常.为什么不

python如何解析类中的私有(双下划线)方法?

考虑以下课程 class Foo(object): @staticmethod def __is(): print('__is') def m(self): Foo.__is() # executes Foo.__is() # fails because of mangling print(Foo.__dict__.keys()) Foo .__是(),当它在定义类后运行时,由于名称大错而失

为什么在Python的双端队列中没有实现__add__?

连接两个deques会导致TypeError. from collections import deque q = deque() q + q 但__iadd__已实现,因此支持. q1 = deque([1]) q2 = deque([2]) q1 += q2 只有__iadd__被实现的原因是什么?解决方法:这是a bug已经在repos中修复,所以它应该包含在下一个发布的Python(3.5)版本

Python中’for a中的[-1]和’中a’之间的区别?

在此post中,以下代码片段可以正常工作. a = [0, 1, 2, 3] for a[-1] in a: print(a[-1]) 参见本answer While doing for a[-1] in a, you actually iterate through the list and temporary store the value of the current element into a[-1]. 同样,我认为在a中做一个,

python – 为什么它不是实例的方法而__iter__是?

参见英文答案 > Why does Python code use len() function instead of a length method?                                    8个 为通常使用Java,C等编程的人获取迭代器的“直观”方法就像list.iterator(). 为什么Python人员选择将它作为像l