"一切"是参照物吗?

我假设Python中的一切都是一种反感... 因此,如果我为此编码: lst = [1,2,3] 因为我在LST: 如果i == 2: i = 4 打印LST 我虽然LST的内容将被修改..(阅读后 "一切"是一种反应.) 因此,似乎为了做到这一点,我需要像: lst = [1,2,3] 对于我的范围(LEN(LST)): 如果lst [i] == 2: lst [i] = 4 打印LST 我误解了什么吗?

# 回答1

Kraftdiner写道: 您现在有我作为对4的参考,在此周期中. Ciao -Chris - - 基督教Tismer:^) Tismerysoft GmbH:休息一下! 乘坐Python's Johannes-Niemeyer-Weg 9a: *星际飞船 * http://starship.python.net/ 14109柏林:PGP键 - > http://wwwkeys.pgp.net/ 工作+49 30 802 86 56移动+49 173 24 18 776传真+49 30 80 90 57 05 PGP 0x57F3BF04 9064 F4E1 D754 C2FF 1619 305B C09C 5A3B 57F3 BF04 您今天想赞助谁? http://www.stackless.com/
# 回答2

在2006-01-04,KraftDiner 写道: 有点. 您误解了" i = 4"的说法. - - 格兰特·爱德华兹·格兰特·尤! 我会得到它的!! 它是 大概是我的一些 visi.com意大利女友!
# 回答3

Kraftdiner写道: 显然.
# 回答4

Kraftdiner写道: 是的. 人们谈论名称和绑定是有原因的. - - -Scott David Daniels schedebydeydeythythy@acm.org
# 回答5

2006年1月4日10:54:17 -0800,Kraftdiner 写道: 打印您的旧列表. 现在清除? - - 干杯, Simon B,sibenyonline.net,http://www.brunningonline.net/simon/blog/(_@_ _) Kraftdiner写道: 给出一个简短的答案:是的. 现在,假设您的误解来自 在评估Python之前,在C中进行编程: 如果你写 i = 4 以下发生: 整数文字4进入python脚本的范围作为对象 类型整数,并且可以从现在开始使用标识符i到达. 因此,我在这种情况下是_kind of_指针/对值的引用 '4',但是...从python意义上说,从c意义上讲. 如果你写 因为我在LST: 然后标识符i"点"指向lst中的值,但如C 您可以在哪里使用指针将其指向的值更改为 分配给 *i或可以使用参考来更改值 参考,在Python中,您不会更改I的值,因为我是一个 标识符,因此在C的意义上没有价值 - 它只是一个名称 用于达到价值. 当您在" for for in"中写入时:'循环 i = 4 您只将标识符i用作另一个python对象的"指针" 正如以前指的那样. 让我们考虑一个清单. 指向列表元素的"标识符"(即构造)lst [i] 在python中的表现就像您在C中所理解的参考一样. 这是= aissionm的含义之间的主要区别 Ent In Python和C中,通常会导致理解它的问题 当某人对C进行编程并期望Python像C一样. 麻烦的核心可能是对单词的理解不同 "参考",在不同上下文中使用(例如Python和C)表示 不同的东西. 因此,正如斯科特·戴维·丹尼尔斯(Scott David Daniels)所说 "人们谈论姓名和绑定是有原因的." 克劳迪奥
# 回答6

Kraftdiner在2006年1月4日星期三10:54:17 -0800写道: 看,这种困惑正是为什么我要打动那些打动的人 将python描述为"引用呼叫". 不是. 它也不不是"按值调用" - 除非您 明确告诉它. 它是"按对象调用" - 您传递 *对象 *. 在内部,这是 很快,因为整个对象不需要移动,只有 指示对象,但您不会得到任何一个呼叫的行为 参考或按值调用. 在上面的代码中,我是一次绑定到INT的名称[1,2,3]. 当您将i重新分配给4时,这不会将对象2更改为 对象4,因为int是不变的. 我只有我的名字反弹到新的 对象4.不会改变像LST这样的对象,其中包括其中的2个. 有关更多详细信息,请参见此信息:http://effbot.org/zone/call-by-object.htm - - 史蒂文.
# 回答7

在2006年1月4日星期三20:05:38 +0100时,克里斯蒂安·蒂斯默(Christian Tismer)写道:这是真的. 不它不是. LST是对1、2和3 i的引用的列表的引用,是对列表中的每个元素的引用,其中一个是另一个元素. 但这不再是涉及LST的参考,在获得其内容之前,该列表会被删除,并且仅返回了这些列表. 看看人们必须跳到什么混乱,复杂的箍 将python的行为的圆形钉在呼叫的方形钉上 参考"?http://effbot.org/zone/call-by-bobject.htm python没有参考文献或指针,除了内部 Python编码器无法与他们联系. 它有名称和对象. 继续思考 关于"通过参考电话",您只是困惑自己和他人. 思考 关于名称和对象,它是简单而直接的. - - 史蒂文.
# 回答8

史蒂文·达·阿普拉诺(Steven D'Aprano)写道: 看,这种困惑正是为什么我要打动将Python描述为"召唤"的人们的冲动. 不是. 它也不不是"按值调用" - 除非您明确告诉它,否则Python绝不会复制对象. 它是"按对象调用" - 您传递 *对象 *. 在内部,这是非常快的,因为整个对象不需要移动,而只需指示对象,但是您不会通过参考或按值呼叫的呼叫行为. 在上面的代码中,我是一次绑定到INT的名称[1,2,3]. 当您将i重新分配给4时,这不会将对象2更改为对象4,因为int是不变的. 只有名称i是反弹到新对象4的. 他们. 有关更多详细信息,请参见此信息:http://effbot.org/zone/call-by-object.htm 似乎很难以直接的方式解释这一切 使用图片显示处理作业时发生的情况 说明什么是什么和如何称呼. 可能是一个小的好 电影可能是可以移交给Python Newbies的正确媒介 来自C,为正确理解提供一些暗示. 更换 一个单词和另一个词不足以避免混乱 概念可能并不总是那么容易掌握(我仍然有问题 了解它如何使用本地和全局的方式在"内部" 字典等). 缺乏关于良好参考的知识是我决定去的原因 尽管事实是在这里给出的答复,但许多其他帖子 已经在那里,但是没有(包括我的)涵盖各个方面,所以 我可以说:"哇!这是一个特别的解释 什么都没有添加到它!". 在任何地方都有对该概念的最终启发性解释 python中使用的标识符和变量,以防下一个发布 这种命中率comp.lang.python,它肯定会在它们来的时候 很常规. http://effbot.org/zone/call-by-object.htm确保尝试良好 解释,但在我眼中,什么都没有立即启发. 克劳迪奥
# 回答9

史蒂文·达·阿普拉诺(Steven D'Aprano)写道: 我不会争论这一点,但我会指出"名称"一词是 不足以存储在列表中的任何内容. 如果不是参考,您怎么称呼它? "绑定"一词不是 在这里真的很合适,因为它很容易与 绑定(即通常是分配的功能). -peter
# 回答10

Steven d'Aprano 写道: 除了这完全没有 *与Python有关(或 不存在)通过引用致电. 这是关于绑定名称的困惑 vs.分配到变量. 适当的人打扫 这种情况是谈论分配到变量的情况. 它是"按对象调用" - 您传递 *对象 *. 在内部,这是非常快的,因为整个对象不需要移动,而只需指示对象,但是您不会通过参考或按值呼叫的呼叫行为. 不,当您的情况下,您可以通过参考获得 *准确的 * 通过引用开始传递对象. 如果我将C对象声明为 " struct foo bar"并执行c"逐次引用"传递"攻击 &bar,当我通过对象时,我得到了完全相同的行为 Bar引用了Python子例程. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答11

彼得·汉森(Peter Hansen)写道: 正确的. 列表中存储的是参考. 如果不是参考,您怎么称呼它? "绑定"一词在这里并不合适,因为它很容易 与绑定的操作相混淆(即通常是分配的操作). 为了澄清,Python中的分配声明是绑定,不要 确实为变量分配值. 其他语言的作业这样做 - 这就是为什么人们在接触Python时会感到困惑的原因. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答12

史蒂文·达·阿普拉诺(Steven D'Aprano)写道:瞧,这种困惑正是为什么我要打动将Python描述为"引用呼叫"的人们的冲动. 不是. 在阅读我的帖子时,我意识到这可能 听起来我对Kraftdiner生气. 我的歉意 - 我 不是,我觉得他是不正确的受害者 这里的信息,而不是罪魁祸首. 毕竟,作为Python Newbie,KraftDiner如何 应该知道当人们说" python被打电话给 根据参考",他们的实际含义是" um,除了 它的行为不像任何参考 您可能以前可能使用的语言,并且 有时它的行为更像是按价值呼叫"? - - 史蒂文.
# 回答13

在文章中 Steven d'Aprano 写道: 我同意它可以简单明了. 特殊 不过,我们使用的术语与之无关. 我们大多数人都需要 一个或两个单词要附上这个概念,因为这就是我们的方式 大脑起作用,但英语中没有自然的词 那精确地表达了Python的概念,我们只需要做出 与几个可能的一个或另一个可能进行. 坚持要愚蠢 一个特定的词可以解决所有的困惑,另一个单词 创建它们. 不幸的是让这次十字军达到 您正在挑战人们了解很多的地步 这件事是因为他们不使用您喜欢的单词. 正如其他随访指出的那样,问题根本不是 了解" ="做什么. 虽然以某种晦涩的方式 可能与"通过参考"等有关,这当然不是 有用的离题. 要解释i = 4的作用,我们可以说 创建一个命名的参考" i"至4 将" i"的名称绑定到4 等等 这些中的任何一个都非常清楚,如果您已经理解, 这是大多数重生的信徒都来自的地方. 那些尚不了解正在解释的人,需要 有一点耐心并确保测试他们的理解 进行一些实验. Donn Cave,do@u.washington.edu
# 回答14

Claudio Grondi写道: [狙击] ... 似乎很难以直截了当的方式解释这一切,而不使用图片显示处理分配时发生的情况,以说明了什么是什么和如何称呼. 这与通过参考或通话没有什么不同 价值. 如果您回想起第一次 了解指针,这也令人困惑. 可能是一部漂亮的电影,可能在这里 dium将移交给来自C的Python Newbies,以提示正确理解. 用另一个单词替换一个单词不足以避免混乱,因为这个概念可能并不总是容易掌握(我仍然有问题来了解它如何使用本地和全球词典等等). 不,只是说"按对象呼叫"是不够的,但是 这是至关重要的. 如果您说"通过引用电话",则该术语 带有许多精神包,人们认为他们 了解参考的呼叫意味着什么,如何 行为,一旦听到CBR,他们就会认为自己 了解Python的行为. 他们认为"哦,Python 就像语言一样,CBR,所以它必须行为 像语言foo一样,这个成语用语言起作用 foo,所以它也必须在python中起作用." 有时它似乎确实有效,这只是使 当不这样做时,这会更加困惑. 当他们听到CBO时,这个术语是新的,不同的,并且 没有任何心理框架,所以 认为他们了解Python的行为,他们认为 "现在打电话给什么?这是如何工作的?" 代替 做出错误的假设. - - 史蒂文.
# 回答15

彼得·汉森(Peter Hansen)写道: 我不会争论这一点,但是我要指出的是,"名称"一词不足以存储在列表中的任何内容. 如果不是参考,您怎么称呼它? "绑定"一词在这里并不合适,因为它很容易与绑定的操作相混淆(即通常是分配的). 我只是称之为列表的项目. 事实 cpython使用一系列指针到列表的对象 是实现细节. 不幸的是, "参考"是一个不错的通用英语单词,在此中 上下文它有太多的精神袋,无法安全使用 在新手周围. (经验Pythonistas是另一个 故事当然.) - - 史蒂文.
# 回答16

迈克·迈耶(Mike Meyer)写道: 除了这根本没有 *与Python被引用有关(或未被引用). 这是关于名称绑定与分配变量的混乱. 为这种情况而来的合适人士是谈论分配到变量的人. 迈克,你错了. 而不是谈论"分配给 变量"有害,我同意.但是 混乱是 *准确 *关于通话 误解. 我怎么知道? 因为原始海报这么说! 他说,对 释义:"嘿,我以为Python被打电话给 参考,但我尝试过,但它没有用,什么 给? 这也不是孤立的情况. 您不能比这更清楚. 谈论电话 引用导致混乱和错误的假设 关于Python的行为. 故事结局. 不,当您通过参考开始传递对象时,您会通过引用获得 *准确的 *该行为. 谁在乎python在内部做什么? 严格来说 无关 指针或复制值,有时是一个或另一个. 如果我将C对象声明为" struct foo bar",并执行c'Ar-Reference'的传递和bar攻击,那么当我将Bar引用的对象传递给Python subroutine时,我会得到完全相同的行为. 这不是python的行为的问题 *有时*与引用相同. 问题 Python的行为是否与CBR相同 *总是 * 事实并非如此. 不管原因是什么,Python确实 在其他语言中的行为不像CBR,这是 有害暗示确实如此. 同样,您不应该说Python显然是 仅仅因为 *有时 *它具有相同的价值来调用 作为CBV的行为. 我的意思是,来吧! 一群人争辩黑色 和蓝色的python"显然"是通过引用调用的, 另一个声乐群认为这是"显然" 按值调用. 这不是最小的暗示python - 不是基础C/Java/Python/ 实施,但语言为python ---没有 落入任何一个营地,但正在做一些事情 有时看起来像一个,有时像另一个? 只是Google在" Python是按价值呼叫"和" Python是 通过参考来调用" - 包括报价 - 查看 争论一次又一次,年复一年 一年后. 所有这些都是因为一些错误的二分法 CBR和CBV是仅有的两个有效描述 计算机语言. - - 史蒂文.
# 回答17

迈克·迈耶(Mike Meyer)写道:我不会争论这一点,但我要指出的是,"名称"一词对于存储在列表中的任何内容都充满了含义. 正确的. 列表中存储的是参考. 废话. 列表中存储的是一个对象. Python没有指针. 你让人困惑 基础C实施,将其实施为 一系列指针,带有高级Python代码, 甚至不知道指针是什么. 它只有 对象. 由于我们正在讨论python的观点 程序员的观点,这是无关紧要的 实施确实如此. 如果清单保存了参考,您 可以这样做: x = 5 l = [1,2,x] #第三项指向同一内存位置 #as x; 更改它也将改变x L [2] = 7 断言X == 7 这是"通过参考调用"的行为 暗示. 但是它在高级的情况下无法正常工作 Python代码. *原因 *它不起作用的是对象5是 不变. 如果您只通过了可变的物体 在周围,您会认为Python是通过引用的. 如果您只通过不变的对象, 您可能会认为Python是按价值拨打的. 但是由于 python都有两种对象,它都显示 各种行为. - - 史蒂文.
# 回答18

在文章<43 **************@removemecyber.com.au>中, Steven d'Aprano 写道: 错误的. Python有对象和目标. 名称是目标的子集. 目标是可以包含绑定的任何东西(或参考 您喜欢的术语)到一个对象; 列表是目标的数组. 无论您如何切割;-),李 ST实际上并不容纳对象 仅保留对对象的引用. - - aahz(aaxpythoncraft.com)<*> http://www.pythoncraft.com/ " 19.一种不影响您思考编程方式的语言, 不值得知道." -Alan Perlis
# 回答19

Steven d'Aprano 写道:迈克,你错了. 我同意谈论"分配变量"是有害的. 但是,这种混乱是通过引用误解的"完全 *". 我怎么知道? 因为原始海报这么说! 他说:"嘿,我以为python是通过引用的,但是我尝试了,但它没有起作用,什么给了??" 他是对的,你错了. 查看 *代码 *. 没有 单次通话. 他可能已经说过"通过引用电话",但他的 示例代码与召回电话无关,并且 他没有对参数的语义表现出任何混乱 通过. 他 *确实 *表现出有关该语义的混乱 分配声明. 不,当您通过参考开始传递对象时,您会通过引用获得 *准确的 *该行为. 谁在乎python在内部做什么? 无论是在内部传递的指针还是复制价值,有时甚至是另一个是无关的,无论是无关紧要的. 谁对python内部做什么说了什么? 我同意,是 严格无关紧要. 重要的是 *行为 *. python的行为是否有时与引用相同. python的行为是否与CBR相同,而不是. 你错了. python的行为 *总是 *与CBR一样,一旦 确定python传递的参考. 同样,您不应该认为python显然是按价值调用,只是因为 *有时 *它具有与CBV相同的行为. 实际上,它要么总是与CBV相同,要么与 CBV. 它始终与CBV相同,因为您总是通过一个值 - 该值始终是参考. 但是每个呼叫机制都需要 您总是通过一个值. 它的价值是决定的 通话机制. 您将CBR的参考和一个名称 按名称致电. 我的意思是,来吧! 一群人认为python"显然"是由参考来调用的,另一个人声群认为它是"显然"按价值调用. 我认为我没有看到有人在争论Python是 逐个电话. 有人认为有时是一个 彼此的soemtightimer,但这主要是因为它们有错误 确定了python的参考. Google在" python"上按价值调用"和" python逐年呼叫"(包括报价),以查看该论点一次又一次,年复一年地出现. 所有这些都是由于某些错误的二分法,即CBR和CBV是计算机语言的唯一有效描述. 我尝试了Google,但我看不到 很多论点. 我看到人 宣布一种或另一种方式,而不是很多. 我不 认为这显然与它有很大关系. 我知道那里 除了CBV和CBR之外,还有其他事情,甚至了解Jensen的 设备. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答20

Kraftdiner写道: 为了对"名称结合"行为进行良好的文章,其他人正在谈论:http://starship.python.net/crew/mwh/...igntthink.html 干杯, shalabh
# 回答21

Kraftdiner在2006年1月4日星期三10:54:17 -0800写道: 将翻译成同等的C可能有助于: int _i1 = 1; int _i2 = 2; int _i3 = 3; int _i4 = 4; int* lst [nlst] = {&_i1,&_ i2,&_ i3}; int _idx; / *内部迭代器 */ for(_idx = 0; _idx Business Management Systems Inc.电话:703 591-0911传真:703 591-6154 " cumputatis maledictis,弗拉米斯·阿普里布斯usdictis" - 背景歌 Microsoft赞助的"您想从这里去哪里?" 商业的.
# 回答22

Steven d'Aprano 写作:胡说八道. 列表中存储的是一个对象. Python没有指针. 您正在混淆基础C实现,该实现将列表作为指针数量,与高级Python代码相混淆,该代码甚至都不知道指针是什么. 它只有对象. 我没有说一个关于C,Pointers或其他任何内容的字 处理实施. 由于我们正在从Python程序员的角度讨论观点,因此C实施的作用是无关紧要的. 如果列表保存引用,则可以执行此操作:x = 5 l = [1,2,x]#第三个项目指向与x相同的内存位置#; 更改它也将更改x l [2] = 7断言x == 7,这是"通过参考调用"所暗示的行为. 但这在高级Python代码中无法使用. 现在你在说胡说八道. 通过引用呼叫是关于 *参数 通过*,而不是关于作业声明的行为或 列表. 上述代码的行为与python的方式无关 传递参数. *原因 *它行不通的是对象5是不可变的. 5的不变性与它无关. 如果您更换5 7带有可变的物体,您会得到完全相同的行为: x = [5] l = [1,2,x] L [2] = [7] 断言x == set([7]) 您似乎正在遭受新手的困惑,即认为 Python分配声明将一个值写入LVALUE. 不是 - 它使LVALUE成为对象的右侧 评估对("将名称绑定到一个值",有时是LVALUE 不是名字). 我很确定您知道区别. 同样的事情也适用于CBR/CBV. 物体的不变性 通过没有 与之处理. 这是事实 分配语句绑定值,而不是将其写入 使Python的CBR行为的变量有时像CBV一样. 如果您只在周围通过了可变的对象,您会认为Python是通过引用的. 真的. 但是您仍然会遇到您可以在CBR中做的事情 您在Python中无法使用的其他语言. 那不是因为Python 不是CBR,是因为其他语言有Python 没有. 而且,如果您只通过不变的对象,您会认为Python是按价值呼叫的. 你可能. 再说一次,您也可能会很好地理解这些概念 足以意识到CBR和CBV之间没有任何区别 当您通过不变的对象时. 但是,由于Python具有两种对象,因此它显示了两种行为. 同样,被通过的物体的可突变性(或缺乏) 与它无关. 您可以在其他方面做的事情 使用您在Python中无法做的CBR的语言 - 喜欢更改 呼叫者名称空间中名称的绑定 - 您不能执行 名称绑定到可变的对象或不变的对象. 那个python 当您通过不变的物体时,看起来像CBV是因为CBR外观 像CBV一样通过不变的对象. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答23

史蒂文·达·阿普拉诺(Steven D'Aprano)写道: [...]胡说八道. 列表中存储的是一个对象. 根据Python语言参考: 一些对象包含对其他对象的引用; 这些是 称为容器. 容器的示例是元组,列表 和词典. [http://docs.python.org/ref/objects.html] - - - 布莱恩
# 回答24

迈克·迈耶(Mike Meyer)写道: [...] 他是对的,你错了. 查看 *代码 *. 其中没有一个电话. 他可能已经说过"通过参考" 实际上他没有. 史蒂文在释义中添加了"呼叫". - - - 布莱恩
# 回答25

Quoth Steven d'Aprano : | 迈克·迈耶(Mike Meyer)写道: [...拖出自己的术语挂钩] |>除非这根本没有 *与Python有关(或 |>不被引用. 这是关于绑定名称的困惑 |> vs.分配到变量. 适当的人打扫 |>这种情况是谈论分配到变量的情况. | | 迈克,你错了. 而不是谈论"分配给 | 变量"有害,我同意.但是 | 混乱是 *准确 *关于通话 | 误解. 我怎么知道? | | 因为原始海报这么说! 他说,对 | 释义:"嘿,我以为Python被打电话给 | 参考,但我尝试过,但它没有用,什么 | 给? 但是他真的没有说"通过引用电话"! 实际报价: "我假设Python中的一切都是一种反感……" 和 "(阅读了'每个人之后 hing是一种反应.)" 只是放弃. 你也是,迈克! "变量"是司空见惯的 我们在计划中逃走的事情的术语,您必须 接受我们会使用这个词,无论我们是在谈论python, Java,C或您有什么. 当然,变量的语义 - 如何 它们实际上与值有关 - 可能与一个完全不同 语言对另一种语言,但普遍扮演的角色基本相同 在编程(或数学)中,其价值可能会根据 到程序的逻辑. C和Fortran不拥有这个词,这不仅仅是他们的版本 反对Python和其他一些语言的方式. 每种语言 在其上有自己的角度,它们都将被称为变量. Donn Cave,do@drizzle.com
# 回答26

Stuart D. Gathman写道: ^ - 我在这条线上遇到了麻烦. 是应该的吗? 我想 它不是. claudio i =&_i4; } for(_idx = 0; _idx
# 回答27

史蒂文·达·阿普拉诺(Steven D'Aprano)写道: 但是,如果您将调用机制与作业分开 机制,然后python确实像其他参考一样行事 语. 问题是人们期望随后能够改变 带有分配运算符的引用对象的值. 是的 与C ++和Java等语言不同的作业语义, 不是通话机制. 在C ++中,分配意味着复制一个值. 在 python,分配意味着重新分配参考. 不幸的问题是,人们认为在 与"分配是突变操作"的关联, 2个概念是正交的,Python取代了第二个 "分配是参考重置操作". 我的唯一原因 强调这是因为考虑到这一点,python是一致的, 反对似乎具有2种不同的操作模式. - - Ben Sizer
# 回答28

在2006年1月4日星期三22:38:06 -0500, " Stuart D. Gathman" 写道: 将翻译成同等的C可能有助于: int _i1 = 1; int _i2 = 2; int _i3 = 3; int _i4 = 4; int* lst [nlst] = {&_i1,&_ i2,&_ i3}; 好吧,到目前为止. int _idx; / *内部迭代器 */ for(_idx = 0; _idx
# 回答29

克劳迪奥·格朗(Claudio Gron) di Schrieb: ^ - 我在这条线上遇到了麻烦. 是应该的吗? 我想不是. 我认为他的意思是 如果(*i == _i2) 但是我认为Python确实 如果(i ==&_i2) 因为只有一个持有值2的整数对象,所以 比较地址是足够的(我不确定这一点, 也许更聪明的人可以澄清?). - - 大卫.
# 回答30

Ich Schrieb: 好吧,据我所知,相关功能是 静态int int_compare(PyintObject *V,PyintObject *w) { 注册长i = v-> ob_ival; 注册长j = w-> ob_ival; 返回(i j)? 1:0; } 在对象/intobject.c中,确实按值进行比较. 所以,这是 要么在其他地方进行特殊限制,要么没有优化(应该/可以吗?). - - 大卫.
# 回答31

丹·索默斯(Dan Sommers)写道: 好吧,到目前为止. [SNIP]这是i在Range(LEN(LST))中的c习语,我们都在这里抱怨. 如何(未经测试): /*迭代列表,将i连续地绑定到每个项目; _idx是解释器的内部; 为了清晰度 */ int ** _ IDX,将i的定义与i的分配分开. for(_idx = lst; _idx
# 回答32

Ich Schrieb: 它是特殊的,但仍然按值进行比较. 相关 零件来自" Python/Ceval.c": case compare_op: if(pyint_checkexact(w)&& pyint_checkexact(v)){ a = pyint_as_long(v); b = pyint_as_long(w); switch(oparg){ case pycmp_eq:res = a == b; 休息; } } 对不起,如果我很吵. - - 大卫.
# 回答33

大卫·默曼(David Murmann)写道: 不,python本身只分配一个持有值2的整数对象 但这不一定是唯一可以比较等于2的对象 甚至连值2的唯一整数对象(c扩展程序都可以 创建另一个). 我似乎记得,Python试图"优化" 通过说地址相等的比较,该对象相等, 如果地址不等,请致电__eq__方法,但这不是 一般而言,由于对象不等于自身. (例如,NAN或用户定义的类). 比较的合适的短相等是: 如果( *i == *(&_ i2))... 但是,与Python所做的实际相当于: 对象 *_tmp =&_i2; if(((pyint_checkexact(i)&& pyint_checkexact(_tmp))? *i ==*_ tmp:pyobject_richcompare(i,_tmp, pycmp_eq))... 即检查类型(不是您实际上可以使用C 代码的翻译),用于两个整数适合C longs的整数 并在可能的情况下比较值,否则可怕地调用一些 复杂的比较代码.
# 回答34

Dan Sommers Schrieb: 我看不出此版本的根本不同 到斯图尔特·加德曼(Stuart Gathman)的那一位(除非它有效,但我认为这是错别字). 您想强调python使用迭代器(如果是的话,我将有 将_idx重命名为_iter,因为它不再索引了)? 重点是什么 不在0开始启动for循环? 并且是否有区别 (*i == _idx)和(*i ==*(&_ idx))? - - 大卫.
# 回答35

" Ben Sizer" 写道: 确切地. 关键信息是Python的作业 语句与C/C ++/等人的使用方式不同. 在告诉他们"您不能通过引用打电话给他们,因为python 是按物体调用"可能是正确的,它忽略了关键 信息. 因此,他们有可能在 不同的上下文 - 就像OP所拥有的那样. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答36

2006年1月5日在星期四14:28:51 +0100, David Murmann 写道: 与Stuart Gathman相比,我看不出此版本的根本不同(除非它有效,但我认为这是错别字)... 我同意斯图尔特的错误是错别字. ...您是否想强调Python使用迭代器(如果是这样,我会将_idx重命名为_iter,因为它不再索引了)? 不在0开始启动for循环有什么意义? ... 我试图通过项目列表显示迭代,而不是索引 进入指针列表,但对我来说不再那么清楚 当时我做得很好. ;-) 我想显示的另一件事是,我不会改变 在列表中有任何影响,我错过了Stuart的代码(我的 过错). 也许我的python/c比率很高,以至于看到使用的循环变量 作为索引列表或数组的索引,只是让我感到困扰. ;-) _ vs. _idx对我来说是不开始的,因为与行李相关 用那些话. ...(*i == _idx)和(*i ==*(&_ IDX))是否有区别? 同样,只是强调了比较是通过绑定而不是 而不是直接在物体上,以表明绑定是完全的 独立于对象. 我很确定没有语义 *(&_ idx)和_idx之间的区别在"正常"情况下,但可以 如果_idx挥发和/或Delcared,则会成为一些非常奇怪的角色. 登记. 问候, 担 - - 丹·索默斯(Dan Sommers)
# 回答37

2006年1月4日10:54:17 -0800," Kraftdiner" 写道: 显然,正如其他人已经阐述的那样 上 ;-) 我想知道专注于表情是否有帮助 首先,指出结果始终是指 表示表达式值的对象. 由于您始终得到对价值代表对象的引用,因此 分配只能就该参考所能做什么而具有意义. 您永远无法分配值本身. 因此,作业是 将参考放置在由分配目标语法确定的位置中. 最简单的是一个裸露的名字,然后我们谈到将名称绑定到 价值代表对象. 该名称属于某些上下文和名称空间, 实施将决定如何找到命名的绑定站点 将根据涉及哪个名称空间来保存参考. 例如. 这 绑定站点可能是函数本地名称空间中的优化插槽. 其他任务语法也会创建绑定,也确定我的身份 调用绑定站点. 这些站点可能在另一个对象的表示范围内 并通过某些实施语义的计算找到,例如查找 列表的当前表示形式的适当偏移或访问哈希 dict等的桶/插槽 顺便说一句,为非绑定绑定寻找绑定站点的实现 通常是通过尾随确定的方法和参数的方法调用 分配目标表达式的结尾和要找到方法的对象 由表达式确定,直到尾端. 绑定站点实现不是语言的一部分,而是 绑定对象1:1或1:许多IS. 可变的对象具有可分配的绑定位点. 不变的对象没有(除了 对于初始绑定引用在创建过程中的"分配"). 包含对象 包含绑定位点,而不是值. 绑定站点必须引用一些 值代表的对象或其他对象(如果存在语义上存在),尽管当然是实现的 如果保留语义,则可以以任何方便的方式管理空间. 再次回到表达式,例如评估名称时,名称标识 正如我们一开始所说的那样 "对代表表达式值的对象的引用." 如果是裸露的名称,我们就已经确定了绑定站点后立即获得该参考 与名称关联,因为它包含对价值代表对象的引用. 如果此引用 现在已分配给由另一个裸露名称标识的绑定站点,我们有两个裸露名称 相关的绑定站点,引用引用相同的价值代表对象. IOW,Python默认情况下共享价值表示. 包括可变的价值表示. 哪个 意味着,如果您想要一个与给定值等于给定值的明显可变值,则需要一个表达式 不仅评估要找到对给定的参考,即创建一个新的代表性OBJ ect 使用给定的信息,并返回引用新的. 对于C程序员来说,很容易说"绑定站点"只是指针data位置, 参考文献是指示符,"价值代表 - 对象"只是某些自定义的malloc'Ed空间 结构或数组或两者兼而有之. 对于特定的实施可能是正确的,但我认为"约束网站" 和"参考"正如我刚刚使用的那样,也是抽象的概念,能够替代,non-c Python语义的实施. 所以我认为我会尝试作为可能的术语,看看是否是否 这使任何人都更容易;-) 问候, Bengt Richter
# 回答38

布莱恩·奥尔森(Bryan Olson)在2006年1月5日在星期四05:21:24 +0000写道:[...]胡说八道. 列表中存储的是一个对象. 根据Python语言参考:某些对象包含对其他对象的引用; 这些称为容器. 容器的示例是元素,列表和词典. [http://docs.python.org/ref/objects.html] 很难理解,"参考"一词具有一般, 不精确的英语意义(这显然是报价的方式 以上是使用该词),而在分配的上下文中仍在 并通过更精确的含义来危险 误导? 言语很重要 - 不仅是因为它们的含义,而且是为了 他们携带的含义. 对于从Clike来到Python的人 语言,"参考"一词的意思是在 Python行为的背景. 这就是为什么人们和 框架说明了参考的呼唤意味着什么("我可以做到这一点...") 然后他们发现他们经常 *做不到. 这是一个哭泣的耻辱,因为参考是一个不错的通用词 呼唤以一种不错的通用方式使用,作为您引用的Python Doc 是在做. 但不幸的是,术语"参考"已由c选择 程序员有效地表示"指向价值的指针". Python Doc作者的目的是传达有关的信息 有效的Python. 这意味着他们必须意识到单词' 他们唤起的含义和精神框架. 以同样的方式 程序员必须围绕操作系统或库中的错误工作,一个 好作者必须围绕人们的心理框架来解决这个问题 引起误解. 这就是为什么"参考"是一个不好的词 Python容器和参数处理的上下文:远非交流 有效正确的信息,它给许多读者带来了误导 关于Python代码的行为方式的假设. 证明这是人们写给此新闻组的次数 对"通过引用呼叫"感到困惑 - 不是因为他们与 关于其行为的假设,但是因为有人告诉Python "通过引用呼叫". 或该列表包含对其他对象的"引用". 用英语,我可以说:"我正在写一本关于俄罗斯历史的书. 包括对SM的参考 ITH是俄罗斯沙皇的经典作品." 这是对"参考"一词的良好使用. 没有人认为这一点 我为修改书籍所做的任何事情都会影响史密斯的工作. 书不起作用 那样. 但是在编程中,事情确实有效. 如果我的班级包含一个 引用史密斯的经典作品,我可以修改它. (除非语言 故意限制我修改某些物体的能力,如Python 与不变的物体一起做.) 这就是程序员在谈论参考时所期望的,尤其是 如果它们来自C(或Pascal)背景. 在Python中,有时就是 是的,有时不是,唯一的说服方法是看 对象本身,不是通过思考Python的高级行为. 思考python的行为("它总是通过引用 对象")将在许多程序员的思想中引起误导框架. 单词"参考"是误导性的,应该避免,因为 平均非Python程序员通过该词理解与 经验丰富的毕达斯塔(Pythonista)所理解的东西. 如果我们正在撰写学术论文,我们可以定义"通过参考来调用" 和"对象包含参考"的任何方式,这将是 读者的责任确保他们理解 *我们的 *含义. 但 我们不是 - 我们正在向普通程序员传达信息,许多 他们仍然是学校里的孩子,而不是学者. 他们中的许多会 以先入为主的想法来到python. 参考","分配变量"等. *我们的 *使用责任 不会误导的语言,不会引起不正确的语言 框架,这不会引导他们走上花园的道路,并感到惊讶 python的行为. 如果我们说" python为参考"(或按价值呼叫,就像许多人一样 还说)我们 *知道 *后果是新手写作:"我 被告知python是通过参考来调用的,所以我这样做了,它不起作用, 这是Python中的错误吗? 怎么了?"这不是python中的错误,它是 他们的心理模型中的一个错误,我们将这个错误放入 他们的头. 每次发生的情况, *我们的 *错误,而不是他们的错,因为 使用保证误导的语言. 如果我们使用一个不熟悉的术语 "按对象呼叫",读者没有先入为主的理解 手段并且不会导致错误的假设. 我们知道这将发生,因为它一次又一次地发生 在过去. 我们无法从经验中学习吗? 是 聪明的众生还是我们只是鹦鹉 过去不关心我们说的话? - - 史蒂文.
# 回答39

2006年1月4日,星期三22:51:03 -0500,迈克·迈耶(Mike Meyer)写道:您可能会. 再说一次,您可能还可以很好地理解这些概念,以意识到,当您传递不变的对象时,CBR和CBV之间没有任何区别. 考虑一下: def do_nothing(x): 经过 gumet_tuple =(none,)*10000 ** 4 do_nothing(gualt_tu ple) 如果Python在将其传递给函数之前制作了一个巨大的副本,那么您 会注意到. - - 史蒂文.
# 回答40

在文章中 Steven d'Aprano 写道: ... 后者. 我从我阅读的次数中知道这一点 该参数传递与是否有关 参数是可变或不变的对象. Donn Cave,do@u.washington.edu
# 回答41

迈克·迈耶(Mike Meyer)在2006年1月5日在星期四11:17:44 -0500写道: 那不跟随. 问题不是谈论参考是 *错误 *,而是 误导. 其中"参考"被用作通用术语,它是 几乎是可以接受的,但是任何时间都可以在可能是 误解是危险的,正是因为人们会误解它, 因为他们 *认为 *他们知道什么参考(作业,请致电 参考,无论如何)在这种情况下意味着. 对象不熟悉的事实完全是它的优势. 而不是人们能够得出关于它的含义的结论,而是像他们一样 使用"参考",他们会停下来思考,如果需要,请进一步寻找 有关Python对象模型的信息. 至少,他们不会说 " Python中的所有内容都是参考,所以这应该起作用,但是 不". - - 史蒂文.
# 回答42

Steven d'Aprano 写道: 不,我们学会了说"约束"和"名称". 我们还了解到 虽然给出新手虚假信息,例如" python没有 参考文献或" python不是逐个引用"将帮助他们获得 经过直接问题,它使他们感到困惑 变量和作业没有做的其他领域 思考. 因此,我们学会了处理这种疾病,而不是 症状,并告诉他们python中的变量的行为如何 来自C,Pascal,Algol或Fortran或其他任何变量. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答43

Steven d'Aprano 写道: 我什么都没有,因为我从来没有说过其他话. 在 特别,我仍然声称在传递对象时的pythons行为 因为参数与所有对象的逐个引用相同 您可以在Python中生成. 那不跟随. 你是对的. 该观察结果是基于反复观看人的 在变量分配之间的差异中击败他们的头 其他语言和名称在基于对象的语言中绑定. 直到你 使他们的脑海有这种差异,他们将拥有 问题. 您用来描述参数传递机制的内容是 与真正的问题无关. 问题不是说参考是 *错误 *,而是误导性. 在"参考"仅作为通用术语中,几乎是可以接受的,但是任何时候 它可能被误解的上下文恰恰是因为人们会误解它,因为他们 *认为 *他们知道在这种情况下的参考(分配,按参考,无论如何)的含义. 这是我们不同意的地方. 我认为他们对参考的理解 死了. 破碎的是他们对什么是变量的理解 作业意味着什么. 解决此问题后,其余的掉入了 地方. 对象不熟悉的事实完全是它的优势. 他们不会像对"参考"那样的结论,而不是想得出结论,他们会停下来思考,如果需要,请寻找有关Python对象模型的更多信息. 至少,他们不会说" Python中的所有内容都是参考,因此这应该可以起作用,但这不行". 您提倡的是故意误导人们处理 症状. 我宁愿给他们足够的真相来应对这种疾病. <迈克 - - Mike Meyer http://www.mired.org/home/mwm/ 独立www/perforce/freebsd/unix顾问,电子邮件以获取更多信息.
# 回答44

2006年1月6日星期五12:01:09 +1100 " Steven d'Aprano" 写道:您会认为Python是按价值呼唤的. 你可能. 再说一次,您可能还可以很好地理解这些概念,以意识到,当您传递不变的对象时,CBR和CBV之间没有任何区别. 考虑以下问题:def do_nothing(x):通过buge_tuple =(none,)*10000 ** 4 do_nothing(mute_tuple)如果Python在将其传递给功能之前制作了buge_tuple的副本,您会注意到. 这简洁地证明了为什么新手 *应该告诉* Python通过参考而不是 值. 没有这些基本知识,新来者将无法 可能会做出明智的选择 算法. 但是也许还应该明确 "参考"是指分配给对象的标签,而不是 包含内存位置的变量(这是C "指针"是). 参考通常是一个简单的名称,但也可以是 集装箱表达式以下列表,字典, 或类实例(垃圾邮件,垃圾邮件[0],垃圾邮件['eggs']或 垃圾邮件,例如). 不是元组或弦,因为他们 是不变的,因此没有可分配的参考. 干杯, 特里 - - 特里·汉考克(Terry Hancock Anansi SpaceWorks http://www.anansispaceworks.com
# 回答45

迈克·迈耶(Mike Meyer)写道: 是的,但这并不是误导性的,因为"参考"并不意味着他们认为这意味着什么. "参考"在Python中的意思与C和类似语言相同. 这是误导性的,因为python中的"变量"和"分配"不做他们在C中所做的事情.显示的某些地方是当您通过参考或列表中的参考文献处理时. 也许下一次显示以下琐碎片段 可能有助于证明问题的核心不是 python处理参数 s? 如果是什么: param ['foo'] ='更改' 别的: temp = param ['foo']#temp是_not_参考! temp ='更改'
# 回答46

特里·汉考克(Terry Hancock)在2006年1月5日在星期四22:18:39 -0600写道: "我不喜欢中国菜,披萨给我加油.让我们汉堡吧," 我说. 特里有益地回答:"披萨给你加油吗?那你去了, 这就是为什么我们必须吃中国菜的原因." 我从来没有建议我们应该告诉新手Python被称为 按价值,我否认有可能有两种可能的选择 描述Python的行为是CBV和CBR. 特里可以 阅读此线程,仍然想象有这样的二分法是 担心. 但是,也许还应该清楚地表明,"参考"是指分配给对象的标签,而不是包含内存位置的变量(这是C" Pointer"的内容). 该引用通常是一个简单的名称,但也可以是以下列表,字典或类实例的容器表达式(例如,垃圾邮件,垃圾邮件[0],垃圾邮件['eggs']或垃圾邮件. 不是元组或字符串,因为它们是不可变的,因此没有可分配的参考. 您是否认真地建议您不能在列表中包含元组,或者 将它们传递到功能? 因为这听起来像是在说: " python通过参考.参考通常是一个简单的名称,但是 也可以是一个容器...而不是元组或绳子,因为它们是不变的." 如果您不想说Python不能将字符串传递到功能,那就什么 你是说要说吗? 我会告诉你我说什么:python将对象传递到函数或 作业. 这是否意味着对象被复制? 不,我没有说它的副本 对象. 我离开了传递机制的性质,这就是方式 应该是因为它是实现细节. 这是否意味着可以将对象修改到位? 当然不是, 因为那取决于对象,而不是python高级的性质 行为. 它强调了Python的面向对象的性质,并强调 非常语言警告读者不要假设Python行为 与其他语言相同. 它邀请进一步的问题,而不是 将读者拖入J

标签: python

添加新评论