据我所知,使用 []、{} 或 () 实例化对象会返回 list、dict<> 或 tuple 分别;具有新身份的新实例对象。
这对我来说很清楚,直到我实际测试它,我注意到 () is () 实际上返回 True 而不是预期的 False:
>>> () is (), [] is [], {} is {}
(True, False, False)
正如预期的那样,在使用 list() 创建对象时也会出现这种行为。 , dict()和 tuple()分别:
>>> tuple() is tuple(), list() is list(), dict() is dict()
(True, False, False)
我可以在 the docs for tuple() 中找到的唯一相关信息状态:
[...] For example,
tuple('abc')returns('a', 'b', 'c')andtuple([1, 2, 3])returns(1, 2, 3). If no argument is given, the constructor creates a new empty tuple,().
可以说,这不足以回答我的问题。
那么,为什么空元组具有相同的身份,而列表或字典等其他人则没有?
最佳答案
Python 在内部创建一个 C 元组对象列表,其第一个元素包含空元组。每次使用 tuple() 或 () 时,Python 都会返回上述 C 列表中包含的现有对象,而不是创建新对象.
对于 dict 或 list 对象不存在这种机制,相反,每次都从头开始重新创建。
这很可能与不可变对象(immutable对象)(如元组)无法更改,因此保证在执行期间不会更改的事实有关。当考虑到 frozenset() is frozenset() 返回 True; 时,这一点进一步巩固。比如 () 一个空的 frozenset is considered an singleton in the implementation of CPython .对于可变对象,没有这样的保证,因此,没有动机缓存它们的零元素实例(即它们的内容可能会随着身份保持不变而改变)。
注意: 这不是人们应该依赖的东西,即不应将空元组视为单例。文档中没有明确做出这样的保证,所以应该假设它是依赖于实现的。
在最常见的情况下,CPython 的实现是用两个宏编译的 PyTuple_MAXFREELIST和 PyTuple_MAXSAVESIZE设置为正整数。这些宏的正值导致创建 array of tuple objects大小为 PyTuple_MAXSAVESIZE.
当使用参数 size == 0 调用 PyTuple_New 时,它确保 add a new empty tuple如果列表尚不存在,则添加到列表中:
if (size == 0) {
free_list[0] = op;
++numfree[0];
Py_INCREF(op); /* extra INCREF so that this is never freed */
}
然后,如果请求一个新的空元组,则位于 first position of this list 中的空元组将返回而不是新实例:
if (size == 0 && free_list[0]) {
op = free_list[0];
Py_INCREF(op);
/* rest snipped for brevity.. */
导致这样做的另一个原因是函数调用构造一个元组来保存将要使用的位置参数。这可以在 load_args 中看到ceval.c 中的函数:
static PyObject *
load_args(PyObject ***pp_stack, int na)
{
PyObject *args = PyTuple_New(na);
/* rest snipped for brevity.. */
通过 do_call 调用在同一个文件中。如果参数 na 的数量为零,则将返回一个空元组。
本质上,这可能是一个频繁执行的操作,因此不要每次都重建一个空元组是有意义的。
更多答案阐明了 CPython 的不可变缓存行为:
关于python - 为什么 '() is ()'和 '[] is []'返回False时 '{} is {}'返回True?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38328857/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',