列表比较和元素分配中的一个奇怪之处

以下脚本使我感到困惑. 它创建了两个嵌套列表 比较相同. 在相同的元素分配之后,列表 是不同的. 在一种情况下,更换单个元素. 在里面 其他,更换整列. ------------------------------------------------------------------------------------ ----------------------------------------------------------- ''' 列表列表行为的奇怪性. 发生在下面 Python 2.4.3(#69,2006年3月29日,17:35:34)[MSC V.1310 32 BIT(INTEL)] 在Win32上. 未在其他平台或构建中进行测试. ''' a = [[[1,2],[1,2]],[[1,2],[1,2]]] b = [[范围(1,3)]*2]*2 断言(a == b) 打印"最初,Python报告列表相等" A [1] [1] = [5] B [1] [1] = [5] 尝试: 断言(a == b) 除了断言: 打印"在相同的元素分配后,列表不相等" 打印"现在",一个 打印" B现在",B ------------------------------------------------------------------------------------ ------------------------------------------------- 这是我系统上的输出. ------------------------------------------------------------------------------------ --------------------------------------------------- 最初,Python报告列表相等 在相同的元素分配之后,列表不等 A现在是[[[1,2],[1,2]],[[1,2],[5]]] B现在[[[1,2],[5]],[[1,2],[5]]] ------------------------------------------------------------------------------------ --------------------------------------------------- 这似乎与我的基本期望之一相反,即 相同之后,比较的对象必须保持平等 操作. 我认为必须发生的是" B"列表 包含复制的引用,而不是[范围(1,3)]*2的副本. IMO,Python's ==操作员应检测到列表中的差异 结构因为它导致元素下的不同行为 作业. 迈克·埃利斯

# 回答1

写道: ... 错误的; 平等并不意味着对身份的任何检查. 您可以考虑 "列表对等列表b"的定义为: -len(a)== len(b),以及, - 对于每个有效的索引i,a [i] == b [i] 这是容器"平等"的极其自然的定义: "他们有相等的物品" [[以相同的顺序,对于其中的容器 订单是相关的]]. 在这个极其自然的定义中无处可去 物品的身份开始起作用. 因此,您对项目更改影响的期望(对于 可更改的物品)是不根据的. 尝试简单地表达您的"应该" - 建设性地作为伪代码 可以用来检查您的"加强平等",而不是 限制的抽象术语 - 如果(我强烈怀疑)您 找不到像简单,简洁和自然的定义 上面的两线笔,这可能有助于说服您您想要的 定义不是最明显,自然和基本的,并且 因此,不适合作为语言的一部分选择 核. 确实,如果有人想要任何编码,这是一个有趣的问题 一般性(例如,不变的项目的身份_谁是项目或 属性反过来不去 ABLE_甚至可能无关紧要 您的"加强"平等...但是很难表达! - ). Alex
# 回答2

嗨,亚历克斯, 所有应有的尊重 社区,我不相信平等不应该暗示不变性 在相同的操作下. 也许最基本的观念是数学是左边 进行任何操作后,方程的右侧保持相同 双方. 我们对物理世界的经验是相似的. 如果我 对两个相同的引擎进行相同的修改 汽车,我希望性能差异相同. 如果我的期望得到满足,我会断言两辆车 一开始并不相同,或者我的修改不是 执行相同. 至于容器,您会说包含五美元的信封 账单与包含单个$ 100账单和4个的信封相同 Xerox副本? 如果是这样,我想参与一些信封 与您交流:-) 如我所见,参考复制是非常有用的性能和内存 优化. 但是我认为这不会破坏 断言(a == b)作为相同操作下不变性的预测指标. 干杯, 迈克·埃利斯(Mike Ellis) Alex Martelli写道:( _@_) 哎呀! 上一条消息中第二段的最后一句话应阅读 "如果我的期望未达到……"
# 回答3

>关于容器,您会说包含五美元的信封 如果len(set([信封中的比尔·塞勒纳伯(Bill.serialnumber)))!= Len(信封):reclusemichaelSexchange() 尽管参考的工作方式,但您将拥有一个信封 只包含5张纸张,所有纸张都说"我有100美元 账单"... :) -tkc
# 回答4

[miheide*********@gmail.com] 所以,正如亚历克斯上次所说的那样 尝试简单地表达您的"应该" - 建设性地 可以用来检查您的"加强的伪码 平等",不是在约束的抽象术语中 - if(如我 非常怀疑)您找不到一个简单的定义 简洁明了,就像上面的两线一样,这可能会有所帮助 说服您,您所需的定义不会是最大的 显而易见,自然和基本,因此不会 适合作为语言核心的一部分. 的确, 如果有人想要任何一般性,这是一个有趣的问题 (例如,不变的物品的身份_谁是项目或 属性反过来又不可能甚至不重要 对于您的"加强"平等...但这很难表达! - ). 所以尝试一下. 实际上,您可以学会改变您的 期望,或避免几乎所有面向对象的编程 语言. 对象身份通常是预期的 这种语言的语义,而不仅仅是优化. 考虑一个更简单的情况: a = [1] b = a 断言(a == b) A.Remove(1) B.Remove(1) 糟糕. 最后一行死亡,尽管有一个== b e 第三个语句和" .emove(1)"应用于a和b. 如果 您认为a在第三句""中不应等于b 这,您将过上日益超越绝望的生活 ;-)
# 回答5

mihe*************@gmail.com写道: 如果您花了尽可能多的时间 *学习 *的东西,而您花费了无关紧要的例子, 您最终可能会学习作业,重复运营商和参考如何在 Python. 如果您不想理解它,只有很难理解.
# 回答6

mihexpory thorgmail.com写道: 您会说包含五个$ 100钞票的信封等于 一个包含五个具有不同序列号的$ 100钞票的信封? - 斯科特·戴维·丹尼尔斯(Scott David Daniels) 在文章<11 ******************************************************************************@c74g2000cwc.googlegroups. com>, 写道: 我认为您最终得到了一个完全笨拙的定义,即" ==" 容器,因为您必须检查_istientical_的混蛋 无论它可能发生什么深度,如果您坚持平等 建模物理世界,只有两个列表才能相等. 对于两个列表中的每个相应元素,要么该元素是 对同一基础对象或相应的对象的引用 元素是对没有和永远不会的对象的引用 还有其他参考文献绑定到他们. 例如: ra = ['a','a'] rb = ['b','b'] L1 = [RA,RB] l2 = [RA,RB] 根据您的定义,这将是平等的,并且可以保持平等 L1和L2的相同操作 l3 = [['a','b'],['a','b']] 只要我们的定义,此列表将是相同的 没有人对参考RA或RB做任何事情. 您的 平等测试必须声称L1和L3不等,因为RA 可以更改,这不是在L1或L3上的操作 这也忽略了分析嵌套结构的复杂性 - 如果您有一个元组,包含包含列表的元组,则 如果列表中有别名,那些顶级元组"相等"? 如何 许多级别的平等测试应该进行吗? 是否更常见的测试来查看序列的元素是否是 比较时相同需要新的操作员或手 编码,因为大多数时候程序员对将来不感兴趣 平等与否的结构. - - Jim Segrave(je*@jes-2.demon.nl)
# 回答7

嗨,蒂姆, 在您的示例中,A&B是对同一对象的引用. 我同意他们 应该平等比较. 但是请注意,a == b是每个 在您的示例中,即使在B.Remove(1)提出的价值之后. 这是一个很好的一致行为. 我的原始例子有些不同. A和B从未提及 相同的对象. 它们是由不同表达式创建的容器 没有共同的对象. 出现问题是因为超载 * 操作员在b中制作列表的行级副本. 什么也没有 这是错误的,但事实仍然是A和B在A中有所不同 非常重要 蚂蚁方式. 我同意亚历克斯的看法,检查这种类型的不平等不是 琐碎的编程练习. 它需要(至少) 递归将参考文献与正在比较的容器进行比较. 同时,我知道更困难的编程问题 已解决. 我不同意亚历克斯的地方是 现有行为是"自然". 另外,禁用容器可能是有意义的 提出typesError,尽管这将消除很大程度上有用的 特征. 实际上,我知道Python不太可能采用 选择. 它可能会破坏许多现有代码. 我的 原始帖子中的角度是提高我认为是一个有用的话题 进行讨论并帮助他人避免陷入困境,这使我丧命 数小时的头抓手. 顺便说一句,我从事专业编程已有25年以上,并且 已经使用了至少30种不同的语言. 在过去的几年中, python几乎已经成为我的首选语言,因为 它可以帮助我为客户提供更高的生产力和价值. 干杯, 麦克风 蒂姆·彼得斯写道:( _@_) 是的. 您非常精确地说. 我相信l1 == l2应该总是 返回true,l1 == l3应该始终为false. (除非重新分配L3 AS L3 = L1). 您对所有元素都有单独操作员的想法 在比较时,数值相等的值是一个很好的值. 因为缺乏更好的名称,它可以称为deepcopyequality(a,b)和 将等效于两个不同的字节比较 记忆中的区域由A和B的深副本创建. 干杯, 麦克风 吉姆·塞格雷夫(Jim Segrave)写道:我认为您最终对容器的" =="完全笨拙,因为您必须检查_sidentical _对可能发生的任何深度的别名,并且如果您坚持要对物理世界进行平等建模,则两个 列表仅在以下情况下是平等的:对于两个列表中的每个相应元素,该元素是对同一基础对象的引用,或者相应的元素是对没有且永远不会有其他引用的对象的引用. 例如:ra = ['a','a'] rb = ['b','b'] l1 = [ra,rb] l2 = [ra,rb]这将按照您的定义相同,并保留平等 在L1和L2 L3 = [['a','b'],['a','b']上进行相同的操作,该列表在您的定义下是相同的 参考RA或RB的任何内容. 您的平等测试必须声称L1和L3不等,因为RA可以更改,并且这不是L1或L3上的操作 ,如果列表中有别名,那么这些顶级元组是否"相等"? 平等测试应该进行多少层次? 更常见的测试是否在比较时查看序列的元素是否相同 和编码,因为大多数时间程序员对未来平等感兴趣或对结构不感兴趣. -Jim Segrave(je*@jes-2.demon.nl)
# 回答8

mi@_)mihexporydeyde*********@gmail.com写道: 但是编程不是数学,分配不是方程式. 这个怎么样: 在[1]:a = 3.0 在[2]:b = 3中 在[3]中:a == b 出去[3]:是真的 在[4]中:a/2 == b/2 出去[4]:false 肯特
# 回答9

在文章<11 ***********************************************************************************************************************************************. com>, 写道: 在Comaprision时期工作的操作员已经存在 - 那是什么==. 如果您真的认为需要进行比较,其中包括 在处理混叠,然后在我看来,一个带有一个带有的python模块 比较的功能集将更有意义. - - Jim Segrave(je*@jes-2.demon.nl)
# 回答10

考虑到自动咬伤的新程序员人数 胁迫,我希望丹尼斯·里奇(Dennis Ritchie)在他时做出了一些不同的选择 设计C.但是我怀疑他曾经梦到它会变得如此疯狂 成功的. 作为一个Curmudgeon纯粹主义者,如果Python提出了一个,我实际上更喜欢它 float与整数比较的TypeError. 干杯, 麦克风 肯特·约翰逊(Kent Johnson)写道:但是编程不是数学,而作业不是方程式. 怎么样:在[1]中:a = 3.0 in [2]:b = 3 in [3]:a == b out [3]:true [4]:a/2 == b/2 out [ 4]:false Kent
# 回答11

是的(除非我正在测试第二个信封的断言 不包含第一个伪造) 斯科特·戴维·丹尼尔斯(Scott David Daniels)写道:
# 回答12

mihedeyde*********@gmail.com写道: 你真的想要 2 == 2.0 是错误的? - - Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/ 美国加利福尼亚州圣何塞,美国&& 37 20 N 121 53 W && aim erikmaxfrancis 没有胜利就没有生存. - 温斯顿·丘吉尔
# 回答13

Le Jeudi 01 Juin 2006 18:00,mithyde*********@gmail.com aécrit*: 恕我直言,您不知道数学的" ="符号存在于Python中, 这是"是"断言. a是b 然后,使用A(或B)做您想做的事,A为B仍然是真实的. 这是expr1 = expr2的含义,但是在计算机科学中,这不是 重要的是纯粹的逻辑(大多数语言甚至都不提供" IS" 断言). - - _____________ Maric Michaud _____________ Aristote -www.aristote.info 3 Place Des Tapis 69004里昂 电话:+33 426 880 097
# 回答14

坦白说,我根本不介意. 在Python,我经常写 像 i == int(f) 或反之亦然,只是为了避免有时会在何时蔓延的微妙错误 以后的修改代码更改原始假设. 在C中工作时,我始终将编译器设置为最大警告和 尽我最大的态度使它们全部消失. 从长远来看,花费的时间 严格的编码总是以节省的时间感兴趣地偿还 调试. 麦克风 埃里克·麦克斯·弗朗西斯(Erik Max Francis)写道:DOO您真的希望2 == 2.0是错误的吗? -ERIK MAX FRANCIS && ma*@alcyone.com && http://www.alcyone.c OM/ MAX/ SAN JOSE,美国加利福尼亚州,美国&& 37 20 N 121 53 W&aim Erikmaxfrancis没有胜利,没有生存. - 温斯顿·丘吉尔
# 回答15

在2006年6月1日在星期四13:40:34 -0700 mihe*************@gmail.com写道: #> Scott David Daniels写道: #>>您会说包含五个$ 100钞票的信封等于 #>>一个包含五个具有不同序列号的$ 100钞票的信封? #>是(除非我测试了第二个信封的断言 #>不包含第一个伪造) 因此,如果美国银行后来决定串行账单 包含" 7"的数字不再有效? 换句话说, *如果 *您假设平等必须由未来保留 修改比两个不同的(可修改)对象可以是 真的相等. - - 最好的祝愿, Slawomir Nowaczyk (slteydedhydeide*为*******@cs.lth.se) 我相信数学文盲会影响每5人中的7人.
# 回答16

我认为"是"是参考的平等,以便 错误的 " IS"操作员告诉您A和B是否参考同一对象. 我一直在讨论的是==是否应该测试"结构性" 平等使A和B在平行突变下保持等效 (以及在共同参考的单一突变下) 干杯, 麦克风 Maric Michaud写道:Le Jeudi 01 Juin 2006 18:00,miheide***********@gmail.com python,这是"是"断言. A是B,然后使用A(或B)做您想做的事情,A为B仍然是真实的. 这是expr1 = expr2的含义,但是在计算机科学中,这并不像纯逻辑那样重要(大多数语言甚至没有提供" is"断言). - _____________ Maric Michaud _____________ Aristote -www.aristote.info 3 place des tapis 69004里昂电话:+33 426 880 097
# 回答17

在2006年6月1日在星期四15:12:23 -0700 mihe*************@gmail.com写道: #>我相信"是"是参考的平等,因此 #> #> >>> a = range(1,3) #> >>> b = range(1,3) #> >>> A是B #> false #> #>" IS"操作员告诉您A和B是否参考同一对象. #>我一直在讨论的是==是否应该测试"结构" #>平等,以使A和B在平行突变下保持等效 #>(以及在共同参考的单个突变下) "平行突变"是什么意思? 特别是,应该是 以下三个比较的结果: x,y,z = [1],[1],[1] a,b = [x,y],[y,z] c,d = [[1],[1],[[1],[1]] a == b c == d a [0] .emove(1) B [0] .emove(1) a == b 因此,我是否正确理解您想要首先比较 (a == b)返回" false"和第二个比较(c == d)返回 "真的"? - - 最好的祝愿, Slawomir Nowaczyk (slteydedhydeide*为*******@cs.lth.se) 在地球上生活可能很昂贵,但包括 每年的阳光周围免费旅行.
# 回答18

写道: ... 这可能是我见过的艾默生著名的最好的例子 quo 关于愚蠢的一致性 - 除了我不认为这 行为将与 除了模糊的手持一组约束之外的任何东西 "自然性"(假设提供善良和 直接操作定义)不可能. Alex
# 回答19

写道: 没有根据,或者,您的 *期望 *可能是不根据的. 采用两个具有足够相似之处的显着复杂性的系统 所有观察者都称为"相同"(因为试图确定 差异(如果有的话)将不可避免地扰动系统 因海森伯格的效果而令人反感 - 即没有可观察到的 差异,OCCAM的剃须刀要求您对系统定位 是平等的,因为您不能否则证明 - 实体不得 乘以不必要的乘以,因此假设"明显平等" 系统的确相等,符合cocam). 现在,执行"相同"(同上)修改:在现实世界中 对于量子效应,什么 您正在对第一个和第二个做. 如果系统是 一开始不稳定,他们很可能会将这些差异扩大到 可观察的比例 - 您就是:"平等"的效果 "平等"系统上的更改可能很容易变得明显不平等. 从哲学上讲,您可以将其归类为两者的"观察" 系统,这些推理向后推理,使您认为要么 系统不等于开始或修改不是... 也就是说,如果您也提出确定性,我们也知道这是一个 对于系统的差异 量子水平很重要. 随时关注爱因斯坦(多样化 距离最近几十年的物理学的光年)假设 必须存在"隐藏变量"(除了可能在 破坏性,不可逆转的方式)解释差异 - 我会坚持 物理学的主流并声称您的期望很糟糕 建立以开始. 我可以用最好的辩论认识论,但这并不是 为此,适当的论坛 - 从关键区别开始 在数学或现实世界中的意思是指出两个系统 "平等但不完全相同"? 最后,这样的辩论倾向于证明 但是,相当徒劳和无效. 在编程语言的世界中,我们通过 请求 *操作 *(从数学上讲,Brouwer-ian) 定义. 提供 *操作 *您想要的方式的定义 平等检查工作,将其与我简单的两线一条形成对比,然后 然后,我们可以进行有意义的辩论,即正确的辩论是正确的 在具有(祝福和 诅咒)可变数据对象... Alex
# 回答20

slawomir nowaczyk 写道: 我当然希望不要,例如: 骑 ICULOUL = C [0] 不是"突变"(那么平等应该保持,对吗?),然后 声称这很奇怪 荒谬. 是"非平行突变" C和/或d. 实际上,我开始怀疑迈克尔斯是否要求 非*相同*的容器(带有非相同的可变物品)可以 被认为是"相等". 如果他认为" =="应该完全意味着 与" IS"一样,这比我到目前为止的衡量还要疯狂. 但是,当然,由于迈克尔斯仍然拒绝提供简单的 直接的操作定义他想要的是什么 这仍然是模糊的和不明显的. 看到 *为什么 *如此重要 提供精度,而不仅仅是到目前为止他给予的手势? Alex
# 回答21

slawomir nowaczyk 写道: 是的,除了关于BOA的(轻微而可以理解的!)错误 角色,这是一个很好的例子. 在这里,全球变化(根据规则 关于哪种钞票彼此"平等",通过制作其中一些 无效,因此与他人不平等) 平等定义" - 要保留它,平等必须退化为 身份. python示例将是更改默认编码的 (不是正式支持,但可以通过重新加载(SYS),提示;-)实现 它可以轻松地使YOTTESTRING与Unicode字符串相等! Alex
# 回答22

Le Vendredi 02 Juin 2006 00:12,miheDexplydeyde*******@gmail.com aécrit*:false the the'IS'操作员告诉您A和B是否参考同一对象. 是的 ! 而已. 您提出了身份的定义: 对于所有操作员OP,OP(a)= op(b)=> a = b 这在现实生活中的使用不佳,因为两件事永远都不相同,只是 可比. 我一直在讨论的是==是否应该测试"结构性"平等,以便A和B在平行突变下保持等效(也是在单一突变下与共同参考文献) 因此,您想要像这样的Twto sequence的比较操作器: seq1 == seq2 => seq1中的所有E,seq2 [seq1.index(e) * is * e !!! 我想这不是很有用,也不是一致的 在Python中使用: seq1 == seq2 => seq1中的所有E,seq2 [seq1.index(e)== e - - _____________ Maric Michaud _____________ Aristote -www.aristote.info 3 Place Des Tapis 69004里昂 电话:+33 426 880 097
# 回答23

2006年6月1日在星期四,19:16:16 -0700 aldeghthe@mac.com(Alex Martelli)写道: #>>"平行突变"是什么意思? 特别是,应该是 #>>以下三个比较的结果: #>> #>> x,y,z = [1],[1],[1] #>> a,b = [x,y],[y,z] #>>> c,d = [[1],[1],[[1],[1]] #>> a == b #>> c == D #>> a [0] .remove(1) #>> b [0] .remove(1) #>> a == b #>> #>>>所以,我是否正确理解您想先比较 #>>(a == b)返回" false"和第二个比较(c == d)返回 #>>" true"? #> #>我当然希望不要, 我也是,但这就是我理解迈克尔斯的最差的方式 DS ... #>实际上,我开始怀疑迈克尔斯是否要求 #>非*相同*容器(带有非相同的可变物品)可以 #>永远被视为"平等". 如果他认为" =="应该意味着 #>与" IS"完全相同,这比我衡量的甚至更疯狂 #>远. 我认为他明确地说"是"无法满足他的要求 要么...但是,我不确定,因为我不明白他的 实际上是要求(它们似乎不变有意义 对象,但是它们应该如何推广到可变的东西我没有 主意). PS. 感谢您对美国银行的解释:我不知道它如何 在Realty中工作,它的名字好;) - - 最好的祝愿, Slawomir Nowaczyk (slteydedhydeide*为*******@cs.lth.se) Java显然是拖把的一个例子(面向货币的编程) - 亚历山大·史蒂芬诺夫(Alexander Stepanov)
# 回答24

在文章<1H ************************@mac.com>中, Alex Martelli 写道: 当然,除了该银行不再存在. 哦, *名称 * 确实,但是现在所谓的bofa只是银行的当前名称 那是收购的百叶窗. - - aahz(aaxpythoncraft.com)<*> http://www.pythoncraft.com/ "我看到``cout'被移动了"你好世界"时代,然后停了下来 就在那里." - Steve Gonedes
# 回答25

" aahz" 在消息中写道 新闻:e5 ********@panix3.panix.com ... 他们在毕达斯内表演 somebank.extend(bofa) bofa =某人 Del Somebank 因此,ID(BOFA)现在是ID(某个银行),而不是ID(BOFA I) 长大). 该名称绝对是收购价值的一部分. ;-) OT,但与对名称,ID和的讨论并不完全无关 值. Terry Jan Reedy
# 回答26

亚历克斯·马特利(Alex Martelli)写道:然后,瓦乔维亚(Wachowia)毫无疑问会很乐意将我的生意从蟒蛇带走;-). 我怀疑您认为BOA是某种"官方"机构 - 并非如此,就像Deutschebank不是德国(而是Bundesbank是)一样. 是的,这是一个有趣的错误,但他的意思是,如果 美国财政部宣布了序列号的账单 包含" 7"无效. 那确实可以完成类比. 这是一个锐利的例子 - 因为金钱被认为是 可替代的,一个$ 100和另一个$ 100,所以两张100美元的钞票 比较它们是否相等. 当然,反论点是与计数没有什么不同 反映了100美元的账单,另外100美元,并得出结论 您有200美元(您需要两个镜子来翻倍您的钱, 从技术上讲;-)). 我认为没有任何方法可以使其"更合乎逻辑" - 是 无论您是什么假设,都会打破某个地方 制作,所以您只需要学习真正发生的事情 避免混乱. 干杯, 特里 - - 特里·汉考克(Terry Hancock Anansi SpaceWorks http://www.anansispaceworks.com
# 回答27

亚历克斯·马特利(Alex Martelli)写道: 不要损害您的观点,而是"海森堡效应",如果 你的意思是"海森伯格 不确定性原则"更多 基本的(和量子"怪异"). 您只是在谈论观察者打扰系统 通过观察过程,这是一个常见的问题,但是 与海森伯格和afaik无关 有名字. 这是经典物理学的正常应用. 我很抱歉nitpick,这只是那些误解之一 永远不想死,就像以为重力是由 磁性或地球的旋转,或者您可以"太近 并被强力野外"吸引",或者事物是 轨道上的"失重",因为它们离地球太远了 重力". 干杯, 特里 - - 特里·汉考克(Terry Hancock Anansi SpaceWorks http://www.anansispaceworks.com
# 回答28

也许我的原始帖子的一些背景会削弱一些 争议. 在航空公司飞行中工作时,我遇到了 使用 *复制操作员初始化的意外结果 列表数组. 当我修改数组的单个元素时 整列更改了. 没有参考书或互联网访问 可用,我试图通过创建一些来理解发生了什么 命令行上的小阵列查看是否有区别 在显式初始化和范围()和初始化之间 * 操作员. 打印时阵列看起来相同,并且a == b返回了. 然而 阵列显然不是等效的,因为突变 相应的元素产生了不同的结果. 我把问题 在第二天,我再看一些并创建了 我发布的示例脚本. 就像我要打的一样 按钮,我意识到 *操作员一定是在创建 参考而不是副本. 然后我加入了现在的辩论 认为==应该检测到的差异. (顺便说一句,我可以指出页面上的python 46" s*n或n*s的结果是n副本的串联". 它 可能会在未来版本中发出警告,认为这不是 严格的情况.) 我的观点是工作的专业软件顾问. 我本质上是一个实用主义者,没有强烈的"宗教"观点 语言和方法论. 正如我在较早的答复中指出的那样,我不 实际上,期望Python改变==操作员的行为. 我确实认为当C从C中采用并扩展时出现了问题 为了比较容器. 在C中,您可以使用它比较 整数,浮子和指针,每个人都知道p == q确实 并不意味着 *p == *q. 此外,编译器发出警告 不同类型之间的比较. 基本上,我正在寻找简单的诊断工具,使其易于容易 了解代码产生意外的真正发生的事情 结果. "加强对等"操作员,使用您的术语 对我有用. 至于构建伪代码 对于这样的操作员,我已经附加了 下面工作脚本. Slawomir的反例和问题 马里克(Maric)和吉姆(Jim 事情. 我敢肯定,有很多方法可以打破它. 例如,元组 没有索引方法,因此必须编写一个索引方法. 不过,我希望它 将使讨论超出"疯狂"和 "手持"和"不可能的". 我没有在 我的任何帖子,都会欣赏同样的礼貌. 干杯, 麦克风 ''' Strongequality- M. Ellis提出的定义的第一个削减. 作者:Michael F. Ellis,Ellis&Grant,Inc. ''' DEF索引(项目,SEQ): '''返回项目发生的索引列表的实用程序功能 在seq''' 结果= [] 对于我在Xrange(Len(Seq))中: 尝试: result.append(i+seq [i:].索引(item)) 除valueerror: 返回结果 def strongequality(a,b): ''''如果a和b在数字上和"结构上"相等的''' 如果A是B:返回true 如果a!= b:返回false ##此时我们知道A和B的长度相同,并且 ##评估数值等效. 我们现在需要弄清楚 ##是否有任何对相同对象的引用 不对话 ## A&B的位置(按Slawomir的示例). 我们还需要 检查 ## a和b用于相同参考的非匹配模式(per 我的例子) ida = []; idb = [] 因为我在Xrange(Len(a))中: 如果[i]是b [i]: 继续 如果isinstance(a [i],(int,float,str))和isinstance(b [i], (int,float,str)): 继续##我们已经知道它们是数字上的 平等的 ida.append(id(a [i])) idb.append(id(b [i])) ##我们知道ida [n]不是所有n的idb [n],因为我们 省略了所有 ## a为b的情况. 因此Slawomir的例子是 检测到 ##在两个列表中出现任何ID. 对于IDA中的n: 如果在idb中n:返回false ##接下来我们测试我的示例. 我敢肯定可以编码 更多的 ##更优雅... 对于Xrange(Len(IDA))的J 如果索引(ida [j],ida)!= indices(idb [j],idb):返回 错误的 ##最后,重复... 如果不是strongequality(a [i],b [i]):返回false 返回true 如果__-Name __ =='__ main__': ##基本测试用例 断言strongequality(1,1) 断言不是strongequality(0,1) ## Slawomir的示例 x,y,z = [1],[1],[1] a,b = [x,y],[y,z] c,d = [[1],[1],[[1],[1]] 断言strongequality(c,d) 断言a == b 断言不是strongequality(a,b) ##我的例子 a = [[[1,2],[1,2]],[[1,2],[1,2]]] b = [[范围(1,3)]*2]*2 断言a == b 断言不是strongequality(a,b) 打印"所有测试还可以". 亚历克斯·马特利(Alex Martelli)写道:那么,你为什么不满足我的要求? 提供一个简单的具体定义,了解您的平等观念的表现. 我注意到您的缺乏反应像拇指酸痛一样脱颖而出 - 您所提供的只是您想要的一组限制,并且收集了不良的类比和手持. 传统数学不支持"变化"的概念,也不支持平等和身份之间的区别. "现实世界"无法定义哪些修改" 实体"除了它们的效果外(如果结果有所不同),原始平等是错误的,或者修改不是"相同的").但是,现实世界确实具有"执行完全相同的操作步骤顺序"的概念, 而且,通过对"平等修改"的定义,您的断言是不根据的 - 或者,您的 *期望 *可能是不根据. 所有观察者相同的"相同(因为试图确定差异(如果有的话),不可避免地会因海森伯格的效果而无法解除系统 - 即,没有可观察到的差异,它可以通过Occam的剃须刀来确定系统,因为您需要您的系统相等,因为您是平等的,因为您是平等的,因为 不能证明否则 - 绝不能超越必要的实体,因此假设"观察到的平等"系统确实是相等的).现在,执行"相同"(同上)修改:在现实世界中,由于quan, TUM效应,您对第一个和第二个的效果将存在可观的差异. 如果系统开始不稳定,它们很可能会将这些差异放大到可观察的比例 - 您就是:"平等"变化对"平等"系统的影响很容易变得显然是不平等的. 从哲学上讲,您可以将其归类为对两个系统的"观察",这使您向后推理,这使您认为系统不等于开始或修改不是...也就是说,如果您也假定确定性, 我们也知道,这是对量子级别差异的系统的不必要的强烈假设. 请随意跟随爱因斯坦(以及距离最近几十年的物理学的不同光年),假设必须存在"隐藏变量"(除了可能具有破坏性的,不可逆的方式外,无法观察到),以解释差异 - 我会坚持 物理学的主流并声称您的期望是从开始的. 我可以用最好的辩论认识论,但这并不是真正的论坛 - 从关键区别开始,在数学或现实世界中的含义,指出两个系统"平等但不完全相同" ? 最后,这种辩论往往证明是徒劳和无效的. 在编程语言的世界中,我们通过要求 *操作 *(从数学上讲)定义来削减追逐. 提供"操作 *"的定义,以使您如何使用平等检查,将其与我简单的两线一条形成对比,然后我们可以进行有意义的辩论,即哪一个是在编程语言的核心中使用的正确的辩论 有可变数据对象的(祝福和诅咒)... Alex
# 回答29

在消息中写道 新闻:11 ****************************@g10g2000cwb.googlegroups.com ... 您的意思是"不严格的情况"吗? TE Rry Jan Reedy
# 回答30

写道: ... 您声称Python的语义是"与我的一个 基本的期望","一个奇怪的",仅导致(您在您的 第二篇文章)来自"性能和内存优化",并试图 通过模糊(即,"握手")对Python进行严厉的批评. 吸引与"数学"和"现实世界"的类比. 我不认为这种严厉的批评有任何合理的基础, 也不是称其为"不可能的" 描述:以及==操作员确实满足的语言 您声称渴望 *平等操作员本身 *的约束(如 反对,对于单独的模块中的某些辅助/检查器功能 检查和调试)确实是疯狂的. 如果我的意见 我相信,这可以准确地反映出案件的事实,声音 对您来说,"贬义",这不是我的选择的问题 一部分,与您首先选择表达的内容一样多. 提出您最近的说法:"每个人都知道p == q确实 并不暗示 *p == *q";众多("贬义")形容词i 用您认为不准确或不合适的主张标记您的断言? 我称这是错误的,荒谬的,虚假的,毫无根据的和放错的,调味的 混合使用副词,包括"完全"和"可怕的". 它 在我看来,这些形容词和副词都是合适的 准确(尽管我的全部都重复了,但 重复确实传达了我对此事的意见的强度). 这是一个事实问题,很容易捍卫强烈的意见 (可以对"事实"进行检查); 在"应该"的问题上(什么 语义"应该"某种语言构造具有 最自然,最简单,最有用 - 除了任何问题 优化)这样的轻松是,las,而不是……而是…… 关于"应该"的情况,非常富裕的冲突意见更加困难 比对"事实"容易审查的意见并不意味着 "应该"(在其作用方面更重要,这更重要 在未来的语言设计上!)不太重要 - 相反. 我不相信我会再遵循这个线程. 我希望你 在未来的努力中,祝您好运 - 如果您可以回到 作为您自称是的实用主义者,也许将来您可能会 选择以表达您的调试需求和Desiderata 将专家处置一些提供技术来帮助和支持您的专家 他们认为,而不是与损害作斗争,而是 如果某些("疯狂")建议,该技术的未来 成为其中的一部分. Alex
# 回答31

Terry Reedy 写道: 考虑到同一的下一个(也是最后的)句子 段落为" n如果零或小于零,则结果为空 与S相同类型的顺序"我不t Hink有什么 引用句子中的误导. 而且,由于该段是 关于序列,不仅是列表, *使用该序列是可怕的 措辞建议:" bah!"*3不是列表,而是 该字符串的三个副本的串联 - 不再,不少. 或者可以说结果 *与 *(不 *是 *)相同 在这种情况下,我发现这种区别为空填充,零 在任何平面上增加了价值 - 包括" Pedantry"的平面;-). n *浅 * S.'S.'浅的副本的串联表示每个副本 我认为介绍"浅"的概念是不好的 文本中谈论所有序列的观点 - 包括 诸如字符串之类的,它不适用. 但是,无论如何,感谢您的建议! Alex
# 回答32

亚历克斯·马特利(Alex Martelli)写道: [狙击] 有人可以关闭这个机器人吗? 我认为它用完了 控制. 似乎无法理解"不要邪恶"可能 当你很小的时候要好(至少不是很糟糕)但是 当你大时,变得明显邪恶. 你大的时候好吗? 我真的不知道,我认为 甚至没有其他人. 但是只是禁止的事情 不是确切的定义 - 数学家以前做过的方式 物理学家将它们震惊 - 似乎弊大于利. 在我看来,从僵化的规则遵守到 慢慢接受更多的疑问和不一致 - 因为我们都 在这里的成年人 - 这与放开这样的事情有关 幼稚地遵守平等与平等之间的混乱 身份. 让我有资格在任何人得出结论之前的最后一段 功能也不正常,将使所有人遭受破坏. 编程语言中似乎总是有些不清楚的部分 人们一直在尝试新结构以绘制一些结构 新领土. 我记得套装,发电机和元素. 仅在那之后 人们注意到问题(不要修改您要迭代的东西) 找到解决方案的方法(如果您将所有内容都放回原处,则可以 正确的时刻),最后将这些方式凝结成正式的 认可编码实践. 现在我们正在挣扎于不变性和 序列. 如果您知道自己在做什么,那不是问题,但是 那些知道自己在做什么的人到底是吗? 它指示 也许这是一种新语言结构的诞生. 但是为什么要停在那里呢? 我希望一定的开放性 即使社区讨论有争议的事项,即使 只是为了教育新移民. 但可能是这样的 愿意接受怀疑,而无需积极寻求它 - 这似乎是愚蠢的,但是我是谁,即使是谁 - 使发展更高的语言和认知结构成为可能. 安东 '即使这意味着在之前变成LISP 继续'
# 回答33

写道: 就像您可能喜欢有人"关闭我"的那样,那 (不幸的是,毫无疑问,从您的角度来看)不太可能 发生. 虽然"做出预测总是很困难,尤其是 关于未来",最有可能的事件是我将 继续生存一段时间,可能是可以容忍的健康. 顺便说一句,供您的信息:在现代西方社会中,公开 希望某种对手的死亡通常被认为有些不挑剔 粗鲁,除了战争时期或类似的四肢. 存在 意识到这样的社会善良和惯例可能会有所帮助:即使我是 希望有人像蠕虫一样把你压在脚下,我会 避免在公共场所表达这种愿望,也可能是私人的. Alex
# 回答34

亚历克斯·马特利(Alex Martelli)写道:您可能会喜欢某人"关闭我",这(不幸的是,毫无疑问,从您的角度来看)不太可能发生. 尽管"做出预测总是很困难,尤其是关于未来",但最有可能的事件是,我将继续生存一段时间,可能是可以容忍的健康. 你完全错了. 我不是想杀了你,但我是 试图使你复活. 一个不演变的过程已经死了. 停下来 它释放了宝贵的资源,使其能够再次活着. 安东 "活着正在变异"
# 回答35

嘿,亚历克斯,减轻了! Python是一种编程语言 - 不是您的 家庭,宗教或公民权利. 干杯, 麦克风 Alex Martelli写道:您能给我一个示例,例如,对于序列S,x = s * 3在结构上与x = copy.copy.copy.copy.copy.copy.copy.copy.copy.copy.copy( S)...? 也就是说,序列上的"* 3"不是该序列的三个副本(当然!)的串联? 我认为您不能...我不能反复解释或指出一侧正常,普通,浅的副本之间的区别,另一侧是"深副本",每次都可以区分这种区别 重要(因为某些读者可能不知道它); 这种无尽的重复会使简而言之完全摆脱其作为简洁的桌面参考的角色,并严重阻碍了它的实用性(尤其是通过破坏任何最终 *获得 *至关重要的人的实用性,而不仅仅是以这种方式). 然后,您可能已经避免试图说服任何人,甚至试图暗示,在理想版本的python == *中应该 *表现出您的方式 - Python的语义 *完全是为了重新讨论,目前正在重新讨论,请注意 未来的" Python 3000"发行版,因此这是该语言历史上非常罕见的时期之一,其中潜在变化的后退不相容性是_NOT_一个阻止点. 通过断言您的版本==将是"更自然的",并试图通过模糊的手势对数学的含糊 和"现实世界",您设法将我的心态(可能是其他一些讨论者的思想)转变为对该提案的完全和绝对反对的一种 - 到目前为止,我花了很多时间和精力来思考这个问题,我是 现在完全确信,具有这样的AN ==运算符的语言而不是Python的当前语言是一场完全,纯净的灾难,我拒绝使用该语言,无论它可能呈现给我什么其他"好"功能. 我离开了出色的工作,只是因为他们会要求我使用一些我无法忍受的技术,而我的生活中已经不止一次:这就是我对您的说法的强烈(和负面)的感觉 对于内置==,您的语义将比Python's优于python. 通过设法将我的心态(并使我花费我的精力和时间)反对您的"更自然"的主张,您至少已经设法确保我现在不会为您的调试提供任何帮助或支持 需要. 如果您像您声称的那样务实,那么这种考虑将在您的选择中具有很高的权衡. i.ie.,如果您想吸引任何此类支持和帮助,那么与"最自然"主张的态度完全不同,将会更加富有成效 - 并且您继续尝试辩论该问题根本没有帮助 两者:如果是这样,那么每个人都是完全,完全,完全,可怕的*错误*,因为在C中,p == q ***确实***暗示*p ==* 结果q,给定平等 - 可以合理地指定:p == q == 0并不意味着 *p和/q的任何内容,这可能会产生随机的结果,崩溃或其他任何东西 - 当然) . 毫无疑问,您要说的是说与您实际说的完全不同的话,但是我恭敬地建议您屏住呼吸,而不是继续试图捍卫无可辩驳的立场. 我不同意,我无法想象任何世界状态都会让我同意您的说法,即通过允许对Python的容器的平等比较"出现问题"(许多其他语言都允许这样的比较,BTW;我会的; 如果一种声称"更高级别"的语言没有),认为这是可怕的疣). 您当然要"支持"(ha!)您的荒谬主张(显然,完全是错误的,毫无根据的和放错了)的主张,对C指针没有"帮助",但即使是完全准确的主张 C(或机器代码,COBOL或RPG ...)几乎是无趣且无关紧要的. 有些人,有些人不这样做,具体取决于情况 - 例如,我不认为即使使用 - 墙(或等效设置),任何c编译器都会对签名和未签名的整数的平等比较(也不应该不应该) , 当然)! 而且,当然,您正在介绍的第十一个侧面路径确实与案件无关,因为当您比较两个列表列表时, 按Python的规则平等,但根据您对"更自然"的原始主张``不应该'',无论如何您都在比较平等类型的对象. 一个 *功能 *在调试和诊断包中执行此类检查的功能本来是 - 如果您没有迫使我花费太多时间和精力来捍卫Python的设计选择,以反对您的说法,那就是其他选择将是"更自然的", 您可能在开发它方面得到了帮助和支持. 但是,您选择提出"更自然"的不可基础的主张,因此您得到了Flamewar:您的选择. 您声称Python的语义是"与我的基本期望之一相反","一个奇怪的",仅在"表演和记忆优化"中导致(您在第二篇文章中说),并试图证明这种严厉的批评是通过证明对Python的正当批评. 含糊(即"手动")吸引了"数学"和"现实世界"的类比. 我不认为这种严厉的批评有任何合理的基础,也不认为称其为"不可能的"只是一种恰当的准确描述:==操作员确实满足了您声称渴望 *平等的限制的语言 操作员本身*(与单独的模块中的某些辅助/检查器功能相反,进行检查和调试)确实是疯狂的. 如果我相信我的观点准确地反映了案件的事实,那么对您来说听起来是"贬义"的,那么,这不是我的选择,而是您选择第一个中表达的内容 地方. 提出您最近的说法:"每个人都知道p == q并不意味着 *p == *q"; 我对您的主张标记的众多("贬义")形容词中的哪个是不准确或不合适的? 我称这是错误的,荒谬的,虚假的,毫无根据的和放错的,并通过选择"完全"和"可怕"在内的副词进行了调味. 在我看来,这些形容词和副词都是适当和准确的(尽管对我来说,使用它们是重复的,但重复确实传达了我对此事的意见强度). 这是一个事实问题,很容易捍卫强烈的意见(可以对"事实"进行检查); 在"应该"的问题(应该使用什么语义"的问题中,某种语言构造具有最自然,最简单,最有用的 - 除了任何优化问题外,还没有),这是可靠的,而不是给予的. .但是,关于"应该"的情况非常富裕的意见与对"事实"的观点相比,这一事实要困难得多,这并不意味着"应该"(这更重要的是,这更重要的是,这可能是他们的效果 在未来的语言设计上!)不太重要 - 相反. 我不相信我会再遵循这个线程. 祝您未来的努力祝您好运 - 如果您能回到您声称自己是的实用主义者,也许将来您可能会选择表达您的调试 需求和逃避者以某种方式处置专家提供帮助和支持您的技术,而不是与他们抗衡的损害,他们认为,如果某些("疯狂")的建议是,这将导致该技术的未来 成为其中的一部分. Alex
# 回答36

" Alex Martelli" 在消息中写道 新闻:1HGBJX1.1GN7HAIPX7X5N%al ***@Mac.com ... 亚历克斯(Alex),在迈克尔(Michael)的上下文中回应这句话时,我是 对他的回应和他对"严格情况并非严格情况"的主张,而不是对 你. 我写的是我书的一段草稿 (与您的竞争无竞争),而不是对未来版本的建议 书. 更准确地说,s*n是[]随着s n次延伸的, A ** b通常被解释为"自身乘以b次"之类的. 更准确地说说,它是" 1乘以A b tips" 这清楚地表明0*s == s*0 == [] 这清楚地表明,A ** 0,包括0 ** 0是1. 并且避免了显然具有误导性的单词"复制". 考虑到包括迈克尔在内的人数,他们很困惑 基于他们对什么和没有复制的困惑,我不会 认为称为"复制"显然具有误导是不公平的. 我的意图 这个短语是暗示一个误解了其中的人 上下文将是误导的,而一个理解复制的内容的人则将 没有复制的内容不会. 我的代码片段的目的是解释/说明复制的内容. 虽然(显然)仅作为列表中的Python代码,我将 认为如果初始分配和list.extend,该算法是通用的 方法是适当解释的. 当然,我认为在Cpython代码中,实际初始化是 更像(长度为一个空白值) *(n * len(s)),然后是n个切片 作业,但是此的Python代码仍然是列表特定的,并且 也将更加复杂,而没有太多帮助理解 结果. 字符串有点特殊,因为字符串中的字符是 除非并从字符串中提取,否则不要包裹为Python对象. 因此,人们不能轻易地谈论序列中包含的对象. 在这种情况下,我发现这种区别为空填充,任何平面上的添加值零 - 包括" Pedantry"的平面;-). 也许您应该降低过度劳累的情感主义并看一看 在镜子里. 在 *您对迈克尔的反应中,您做了 *相同 * 区别: 我认为在文本中的某个点介绍"浅"的概念是不好的,该概念正在谈论所有序列,包括诸如字符串之类的序列,它不适用. 同样,我不是在建议您这样做. 添加"浅"是 迈克尔的"福利"完全是学费的. 要明确,我不是 * * 支持他的警告建议. 但是,无论如何,感谢您的建议! 我们俩的目标是更好地曝光Python,因此初学者H

标签: python

添加新评论