查找对象的实例引用

对不起,这个问题...
您如何找到对象的参考名称?
所以如果我有这个
bob = modulename.ObjectName()
我如何发现名称为"鲍勃"

# 回答1


阿斯特利·勒·贾斯珀(Astley Le Jasper)写道:
为什么需要找到这个?您知道它的名字是"鲍勃"。
- -
Carsten Haese http://informixdb.sourceforge.net
# 回答2


10月16日,4:01*PM,Astley Le Jasper
写道:
这是一个常见问题解答:http://www.python.org/doc/faq/progra...e-of-an-bobject(_@_ _)
10月16日,16:52,Carsten Haese 为什么需要找到这个?您知道它的名字是"鲍勃"。
- -
carsten haesehttp://informixdb.sourceforge.net
我正在创建mulitple实例,将它们放在列表中,迭代
通过列表将它们发送到处理它们的某些功能
具有某些实例特定参数。与:
鲍勃= someObject()
harry = someObject()
fred = someObject()
parameterdict = {'鲍勃':( 0,1,2),'harry':( 3,4,5),'弗雷德':( 6,7,8)}}
people_list =(鲍勃,哈里,弗雷德)
适用于人的人:
add_parameters(人)
def add_parameters(人)
mytuple = parameterdict [??????? instance.name ????]]
person.x = mytuple [0]
person.y = mytuple [1]
person.z = mytuple [2]
....或者,可能有一种非常简单的方法
它。
# 回答3


2008年10月16日在星期四08:04:23 -0700,阿斯特利·勒·贾斯珀(Astley Le Jasper)写道:
假设某些对象是可用的,您可以做到这一点:
#将对象本身用作钥匙,而不是他们的名字
parameterdict = {bob:(0,1,2),哈里:(3,4,5),弗雷德:(6,7,8)}
people_list = [鲍勃,哈里,弗雷德]
但是当然,如​​果某些()项目不可行,那就不起作用
(例如,列表或dicts)。
但我认为,这可能是最好的方法(未经测试):
def add_parameters(Person,X,Y,Z):
#注意我们不使用任何全局变量
person.x = x
person.y = y
person.z = z
参数= [(0,1,2),(3,4,5),(6,7,8)]
人= [鲍勃,哈利,弗雷德]
对于人,args在zip中(人,参数):
add_parameters(人, *args)
- -
史蒂文
# 回答4


Astley Le Jasper Schrieb:
为什么需要找到这个?您知道它的名字是"鲍勃"。-Carsten Haesehttp://informixdb.sourceforge.net

我正在创建mulitple实例,将它们放在列表中,迭代
通过列表将它们发送到处理它们的某些功能
具有某些实例特定参数。与:
鲍勃= someObject()
harry = someObject()
fred = someObject()
parameterdict = {'鲍勃':( 0,1,2),'harry':( 3,4,5),'弗雷德':( 6,7,8)}}
people_list =(鲍勃,哈里,弗雷德)
适用于人的人:
add_parameters(人)
def add_parameters(人)
mytuple = parameterdict [??????? instance.name ????]]
person.x = mytuple [0]
person.y = mytuple [1]
person.z = mytuple [2]
...或者,可能有一种非常简单的方法
它。
为什么不简单地做
鲍勃=某些对象(0,1,2)

diez

# 回答5


阿斯特利·勒·贾斯珀(Astley Le Jasper)写道:
简短的答案是 你不能。这是因为python的名字(鲍勃)一定要
对象(modulename.objectName())。它们不是变量
"其他"编程语言。在Python中,绑定多个是完全合法的
单个对象的名称:
a = b = c = modulename.ObjectName()
a,b和c都指向同一对象。一个物体可以无限
绑定到它的名称数量。这是最困难的概念之一
许多人开始理解Python程序员(我知道我很难
首先)。这不是我们自学如何思考"变量"的方式
您可以写很多python,以将您绑定到对象的名称处理
就像它们是"变量"。
为了完成您想要的目标,请将您的实例放入字典中。
实例= {}
实例['bob'] = modulename.ObjectName()
实例['joe'] = modulename.ObjectName()
..
..
..
然后,您可以将它们引用为:
实例[名称]
和/或者,您可以将名称作为参数传递给__init__的方法
objectName,以便它可以"保留"引用的字典键的名称
它(非常适合调试/伐木)。
-larry
# 回答6


拉里·贝茨(Larry Bates)在2008年10月16日上午10:59写道:
简短的答案是您不能。这是因为Python的名字(Bob)
被绑定到对象(modulename.objectName())。他们不是
变量与"其他"编程语言一样。
其他哪些编程语言?我从未见过OOP语言
那没有与Python相同的方式。
但是,这里的"鲍勃"确实是一个变量。这是一个值的变量
(目前)是对某些对象的引用。
正确 - 三个变量(a,b和c),它们都具有相同的值,
即,全部指的是同一对象。没有什么更神秘的
在这里
i = j = k = 42
我,j和k都具有相同的价值。 (OP的问题将
就像问"变量的名称是42?
从理论上讲,虽然您可以制定所有此类列表
变量通过浏览python的内部词,这有点像
愚蠢的事情要做。)
好吧,它们是变量。我不太抓住困难
在这里...除非您(起初)考虑变量
作为持有对象值,而不是对象引用。那
确实很重要,因为它解释了为什么如果您这样做
a = b#其中b是具有属性'foo'的对象...
A.foo = 42
....您现在发现B.Foo也是42。一旦你没有神秘的事
意识到a和b的价值是对某些对象的参考
具有" foo"属性。
不确定这是否对任何人有帮助,但我希望如此!
最好的,
- 乔
# 回答7


10月16日,18:53," Diez B. Roggisch" 为什么不简单地做
鲍勃=某些对象(0,1,2)

迪兹
因为那是伪代码来演示我要试图的内容
达到。这些参数比这更复杂。
# 回答8


感谢您的所有回应。这有帮助。
ta
alj
# 回答9

10月16日,12:25*PM,Astley Le Jasper
写道:
如果您确定它是唯一的,为什么不只是通过对
当地人()?
对于k,v在当地人():
如果v是the_object_im_looking_for:
name_im_looking_for = k
由于该方法有时可以返回多个名称
词典中对象的可变排序。
# 回答10


乔·斯特劳特(Joe Strout)在2008年10月16日在星期四11:24:28 -0600写道:简短的答案是您不能。这是因为python的名称(BOB)与对象(modulename.objectName())相关。它们不是变量,因为他们在"其他"编程语言中。

其他哪些编程语言?我从未见过一种OOP语言
与Python的工作方式相同。
但是,这里的"鲍勃"确实是一个变量。这是一个值的变量
(目前)是对某些对象的引用。

传统上,"变量"是一个命名的内存位置。
我必须使用"变量"来描述Python名称/
价值绑定在于它具有会使程序员感到困惑的含义
熟悉类似C的语言的人。例如:
DEF INC(X):
x += 1
n = 1
INC(N)
断言n == 2
为什么这不起作用?这对任何期待的人来说都是完全神秘的
C样变量。
在这一点上,人们通常会通过声称来使问题感到困惑
"所有python变量都是指针",这是 *实施
细节*在CPYTHON中,但不在其他实现中,例如PYPY或JYTHON。
否则人们会想象Python在您时制作了变量的副本
调用功能。事实并非如此,实际上是Python明确承诺的
切勿复制一个值,除非您明确地告诉它,但是它似乎
解释以上,至少直到程序员开始 *假设 *呼叫 -
副价值行为并发现了这一点:
Def Inc(Alist):
alist += [1]#或alist.append(1)如果您喜欢
返回alist
a = [1,2,3]
b = inc(a)
断言a == [1,2,3]
函数是按值呼叫还是通过参考来调用???
(答案:都不是。他们是按名称调用的。)
我本人经常谈论变量作为速记。但这是一个坏习惯,
因为这对任何认为自己知道变量的人都有误导
行为,所以当我抓住自己做它时,我会修理并谈论名字
绑定。菜鸟可能不知道这意味着什么,但这是一个功能,不是
一个错误,因为它引起了他们的注意而不是发出错误
假设。
当然,您有权任何您喜欢的任何方式定义"可变",并且
然后坚持认为Python变量的行为不像其他变量
语言。就个人而言,我认为这对任何人都无济于事。
[狙击]
但这肯定是几乎每个人几乎一直都会想到的。
考虑:
x = 5
y = x + 3
我很确定几乎每个人都会将其读为"分配给x的5,然后
将3添加到X,并将结果分配给Y,而不是:
"将对对象5的引用分配给x,然后删除x以获取
对象5,将其添加到给对象8的对象3,然后分配一个
引用该结果y。
当然是 引擎盖下到底发生了什么,你不能
*正确*理解Python在不理解的情况下的行为。但
我敢肯定,很少有人会自然而然地认为这种方式,尤其是菜鸟。
参考本质上是指指针,学习指针是
众所周知,人们很难。 Python做得很棒
参考文献很容易,但是它几乎总是隐藏了这样的事实
在引擎盖下使用参考。这就是为什么谈论变量如此
诱人和危险:Python的行为通常 *与
大多数新手对具有"变量"的语言的期望。
- -
史蒂文

# 回答11


2008年10月16日在星期四11:51:43 -0700,Aaron \" Castironpi \" Brady写道:
因为:
(1)通常,对象完全没有名称或多个名称,所以
这通常不起作用(尽管在特定情况下可能起作用);
(2)如果您做很多事情,那将是极低的;和
(3)即使它有效,您有能力支付费用,这几乎是
当然,解决了手头问题的错误方法。
- -
史蒂文
# 回答12


10月16日,8:30*PM,Steven d'Aprano cybersource.com.auwrote:
因为:
(1)通常,对象完全没有名称或多个名称,所以
这通常不起作用(尽管在特定情况下可能起作用);
(2)如果您做很多事情,那将是极低的;和
(3)即使它有效,您有能力支付费用,这几乎是
当然,解决了手头问题的错误方法。
- -
史蒂文
实际上,更称为"相反的映射:
name_im_looking_for = lookup [the_object_im_looking_for]
您只需要与本地变量并联修改它,
这是一个(又是)不好的信号。
# 回答13


阿斯特利·勒·贾斯珀(Astley Le Jasper)写道:
如果您想要一个"个人"名称,请给它一个名称
属性,就像Python对模块,类和功能一样。
somebob()类:
def __init __(自我,名称):
self.name =名称
people = {someob('bob'),someob('harry'),someob('fred')
...
def add_param(人):
mytuple = parameterdict [person.name]
...
# 回答14


乔·斯特劳特(Joe Strout)写道:
简短的答案是您不能。这是因为python的名称(BOB)与对象(modulename.objectName())相关。它们不是变量,因为他们在"其他"编程语言中。

其他哪些编程语言?我从未见过一种OOP语言
与Python的工作方式相同。
但是,这里的"鲍勃"确实是一个变量。这是一个值的变量
(目前)是对某些对象的引用。
正确 - 三个变量(a,b和c),它们都具有相同的值,
即,全部指的是同一对象。这里没有什么神秘的

i = j = k = 42
我,j和k都具有相同的价值。 (OP的问题是
就像问"指42的变量的名称是什么?
从理论上讲,虽然您可以制定所有此类列表
变量通过浏览python的内部词,这是有点 一个
愚蠢的事情要做。)
好吧,它们是变量。我在这里没有抓住困难...
除非您(起初)将变量视为持有
对象值,而不是对象引用。确实是
重要的是要掌握的东西,因为它解释了为什么如果您这样做
a = b#其中b是具有属性'foo'的对象...
A.foo = 42
...您现在发现B.Foo也是42。一旦你没有神秘的事
意识到a和b的价值是对某些对象的参考
一个" foo"属性。
不确定这是否对任何人有帮助,但我希望如此!
最好的,
- 乔
对不起,乔,但我恭敬地不同意"不神秘"。我去过
在此列表中已有8年了,每个星期都会出现这个问题/问题
新手。从传统意义上讲,Python名称不是变量。如果他们
然后是:
a = b = c = [42]
将创建三个独立变量,每个变量都包含一个列表
42的单一元素。这不是Python所做的,几乎每个新手
至少被一个事实咬伤一次。
OW许多帖子在这里阅读,人们做这样的事情:
a = [1,2,3,4,5]
b = a
B.Append(6)
并且不知道为什么现在包含[1,2,3,4,5,6]?
他们没有失败,他们认为b = a将a的内容复制到b中。那是,
他们认为A和B是"持有"值的变量。现在这个术语
"变量"可能意味着与大多数其他新手不同的东西
那个经常列出了这个列表,但是他们全部(包括我刚开始时包括我)错过了
起初名称/值绑定的量具(但是男孩是美丽的
当您终于看到灯时)。也许你很幸运,能够掌握
这个相当强大的概念比我们大多数人更容易。
我认为这是关于python最困难的概念之一
来自VB,C,Fortran,Cobol(OOPS在那里显示我的年龄)等的人。我们
训练了我们的思想,以对待"变量",例如命名的存储桶(或内存位置)。
甚至这里的OP都想询问存储桶中的对象并胁迫它
给他给他的水桶(变量)名称。
正如史蒂文如此雄辩地在另一篇文章中表现出的那样,这个问题是
很难谈论绑定到对象的名称。所以我们回到了
熟悉的语言和使用"可变",这使许多新手感到困惑,因为
他们对"变量"是什么以及它的作用有先入为主的观念。
问候,
拉里

# 回答15


在2008年10月16日,晚上7:30,史蒂文·达普拉诺(Steven D'Aprano)写道:
传统上,"变量"是一个命名的内存位置。
同意。
嗯...我不跟着你。那也不在C中起作用。 'X'
在" Inc"中是局部变量;它的价值只是任何内容的副本
价值您传递的。
影响原始变量(如果确实是一个变量
价值来自;它可能是字面上的或一个表达者或谁知道
还有什么)。
我没有声称 - 我想澄清,而不是
混淆这个问题 。 (当然,如果事实证明我的理解
python的不正确,然后我希望揭露并纠正这一点,
也。)
现在这是神秘的。不调用函数将帧添加到一个
堆?这是否需要在值中复制
该堆栈帧中的变量(例如上面的" X")?当然,我们
现在深入研究内部实施细节...但是它可以肯定
表现得好像这正是它在做什么(并且是相同的
其他每种语言都可以做的事情,afaik)。
这仍然是逐个呼叫行为。在这种情况下的值是列表
参考。使用.append或 +=操作员修改列表
由该列表参考提到。将其比较:
Def Inc(Alist):
alist = alist + [1]
返回alist
在您不修改列表中的地方,而是创建一个
新列表,并在局部变量" alist"中存储参考。
这里的语义似乎与Java或Realbasic完全相同
或任何其他现代语言:变量是变量和参数
是局部变量带有值调用的变量,碰巧的是
有些值可能是对堆的数据的引用。
我不知道那意味着什么。他们会尽我所能
告诉。 (即使该值可能恰好是参考。)
附带问题,对于我自己的教育: * * python有一个" byref"
参数模式?
也许您对人们对变量的看法有一个有趣的想法
表现。我怀疑完美地构成了新的术语
普通的事物(例如python变量)使它们更神秘,
不低于。
不,但是如果我们以标准方式定义它们,并指出
python变量的行为与其他语言中的变量完全一样,
那是有帮助的。
但这肯定是几乎每个人都会想到的,几乎所有人
时间。
考虑:
x = 5
y = x + 3
我很确定几乎每个人都会将其读为"分配给5分配给X,
然后
将3添加到X,并将结果分配给Y,而不是:
"分配对对象5的引用到x,然后删除x以获取

对象5,将其添加到给对象8的对象3,然后分配一个
引用该结果y。
真的。我没有理由相信,就数字而言
值不是数字本身。 (除了偶尔的主张
" python中的一切都是一个对象",但是如果这实际上是正确的,
可观察到的含义是什么?)
从这个意义上讲,我仍然是菜鸟 - 直到几周前,我才
十多年来,触摸了Python。所以我肯定会感谢这个
复习。如果数字真的包裹在对象中,那就是
令我惊讶的是,我想了解任何可以的情况
实际观察到这一点。 (从 +=的行为中不明显
例如,操作员...如果它们是对象,我想它们是
不变。)
但是,清单和尺寸和对象都不会有奇怪的
每种现代语言都会围绕着这些语言而不是
数据本身,因为数据可能很大,而且通常是
更改尺寸 每时每刻。将值存储在变量中
只是愚蠢。
嗯...我敢打赌你30岁。:)所以,我也是如此,我可以
请记住,当人们不得不学习"指针"并发现这很困难的时候。
但是如今,Yoots在Java上抬起,或者是自学的
诸如realbasic或.net(或python)之类的东西。没有
指针,但只有参考和语义是相同的
那些语言。指针难度是回到的
c/c ++,除了EE之外,他们只是不再教书了
专业。
因此,如果语义都是一样的,我认为使用该语义是有帮助的
标准术语。
当涉及数字值时,您可能是对的 - 如果这些值
不变的物体,然后我可以通过将它们视为纯正来安全地获得
值而不是参考(这是RB中的内容,因为
例子)。琴弦就是另一种情况:如不变,您可以安全地
将它们视为价值观,但很高兴知道您不是
每次您都会因复制巨大的数据缓冲区而受到罚款
传递一个函数或将其分配到另一个变量。
但是有了可变的物体,这是普通的,并且期望你什么
有对象的引用,您可以简单地告诉这个
通过以任何方式突变对象。我知道有效的每种现代语言
同样的方式,我敢打赌我不认识的人(例如Ruby)
也这样工作。 Python是一种美丽的语言,但恐怕
在这一特殊方面,这没什么特别的。
最好的,
- 乔
# 回答16


2008年10月16日,晚上11:23,丹尼斯·李·比伯(Dennis Lee Bieber)写道:
否 - 它将 /引用 /复制到包含该值的对象。
对对象的引用是对象引用的值
多变的。如此好,参数在python中通过byval。
似乎是,以及其他所有现代语言的默认值。
分配将RHS值复制到LHS变量。如果是
对象引用,复制的值是对象引用。
所有"值"都是Python中数据的引用 - 但其中一些
值是不变的对象,因此对它们执行的任何操作
创建
新对象,分配为新参考。
好的,那部分与大多数语言有所不同 - 不在
处理对象的方式,但事实是,即使是简单的值
整数包裹在对象中。但是由于这些是不变的
对象,这主要是内部实现细节。
对于对象引用(包括可能对待的可变的参考
人们),Python的行为与其他任何语言没有什么不同。我不知道那意味着什么。他们以icantell的价值为单位。 (即使该值可能恰好是参考。)

从技术上讲,正如我回想起"呼叫命名"的定义,他们
不是。 ...
然后,无论何处,按名称调用作为宏扩展
在称为函数中引用。
感谢您的解释。显然,这不是发生的事情 Python。
就我而言,一切都是python中的" ref" ...
否," ref"参数将意味着这:
def foo(byref x):
x = x + [42]
a = [1,2,3]
foo(a)
....将导致a = [1,2,3,42]。你只能通过
简单的变量(不是表达式或字面意思)和'x'
内部foo不会是局部变量,而是任何东西的别名
变量已传递。因此,任何作业都会影响
传递的原始变量。
但是,如果Python具有任何此类功能,我就不知道。当然
默认行为是通过所有内容(甚至对象引用)
价值。对他们进行的作业不会影响其他任何事情。
或者,使用 +=的复合操作员之一。那是唯一的
python中的真正"陷阱",来自另一种语言的人;你
可能天真地期望x += y与x = x +y相同,但在python中
通常情况并非如此;而是 +=是突变操作员,
就像您上面显示的示例一样。
这也是Python也做的。碰巧的是固定
内存中的位置包含一个对象引用。这里没有区别
在Python的对象引用VB.NET的对象引用之间
指针,爪哇对象引用等等。
那是什么意思?它的意思是:"更换内容(即
与此名称关联的内存位置的对象引用)
带有所在的内存的内容(即对象引用)
通过将内容从此处复制到此处是关联的。"
这是完全相同的事情。 (并且与其他任何人完全相同
语。)
但是他们没有...
他们真的,真的做。
在大多数所有这些语言中,都必须明确区分
副本和参考之间的区别。
只有当您想到20年前或更长时间的语言时。甚至
在C ++中,虽然对象有不同的kludgy语法
"参考"(因为只是指针),这是使用的标准
这样的指针到处都可以处理物体。爪哇清理了
通过用适当的引用代替指针,
vb.net,realbasic,可能是Ruby,当然还有Python。
哈,可能是这样。艾达甚至早于我,我并不是
年轻了!
bah ... pascal中I/O的根部需要指示。
嘿,我记得帕斯卡(Pascal)...那是苹果上使用的语言
IIG,回到初中的时候。我还记得花费$ 800
对于40MB的硬盘驱动器。啊,那是日子!
但是,看来,您是唯一一个争论"语义是
一切都一样:" ...这不是暗示他们不一样吗?
不,这向我暗示了Python中有很多混乱
社区。 :)似乎人(a)真的想
认为Python的对象处理特殊且独特
情感原因,或(b)将其与真正古老的语言进行比较
没有任何对象和对象引用的概念。这个
有 导致了新的术语并传播混乱。我是
与其他人一起工作近十年来回到Python
现代语言(包括为一种实施编译器
他们),我在Python的对象之间根本看不到任何区别
处理和那些。
最好的,
- 乔

# 回答17


10月17日,10:56*AM,Joe Strout
不,这向我暗示了Python *中有很多混乱 *
社区。 *:) *看起来好像是人们(a)真的想 *
认为Python的对象处理是特殊的,并且对于 *
情感原因,或(b)将其与真正古老的语言进行比较 *
没有任何对象和对象引用的概念。 *这个 *
导致弥补了新的术语和传播混乱。 *我是 *
与其他人一起工作近十年来回到Python *
现代语言(包括为 *之一实施编译器
他们),我认为Python的对象完全没有任何区别 *
处理和那些。
最好的,
- 乔
我不会流利的Java,所以您必须成为法官。
在Python:
b = 0
f(b)
无论如何,b ==0。c不能保证这一点。爪哇吗?
更远:
b = {}
C = b
f(b)
无论如何," C为b"都是正确的。 C没有" IS"操作员。
爪哇吗?
最后,"相同"一词是模棱两可或定义不佳的。这可能意味着
"相同"或"相等"。
# 回答18


2008年10月17日,下午1:03,Aaron Castironpi Brady写道:
它确实如此,除非已声明F的参数为参考
范围。 (在C ++中,您会用'&'做到这一点;我不认为是
在C中可能是可能的,但是自从我使用C以来已经很长时间了
如今可能是可能的。)
在Java和RB中也一样,在.NET中也是如此。如果F的参数是一个副本
值参数,然后完全像Python。 (这些语言
还允许参考参数声明,我认为Python
不允许,但是串联是默认值。)
对,同样,这只是证明了Python通过
参考。
好吧,这实际上是正确的,但这仅仅是因为它没有深
平等操作员如现代语言。在C中,B和C将是
指针," c == b"将相当于python的'c
b'(并且在打电话后将是真的,再次假设您没有
竭尽全力使用征用参数声明F)。
是的。行为是一样的。在其他所有OOP语言中也一样
我所知道的。
我认为我们在这里建立的只是Python总是通过
按值和大多数其他语言中的参数,按值传递为
默认值(但是如果需要的话,可以通过参考通过选项)。
Python缺少Byref参数功能,所以当您需要的时候
要做,您必须将您的价值包裹在某种可变类型中(例如
列表)并通过该列表。有点尴尬,但没什么大不了的,因为
有很少有正当理由通过参考来传递某些东西
无论如何,尤其是用元组包装和解开包装的语言。 最好的,
- 乔
# 回答19


在10月17日,4:03*PM,Joe Strout
不是。
但这不是根据价值,Q.E.D.

除了您然后继​​续前进3。
剪子
# 回答20


在10月17日,下午5:19,格兰特·爱德华兹(Grant Edwards) ^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^因为
methink在该线程中唯一真正的分歧是
"现代"语言;乔明确表示他没有比较python
到c,帕斯卡尔或福特兰。
乔治
# 回答21


史蒂夫·霍尔顿(Steve Holden)在2008年10月17日星期五16:36:24 -0400写道:
我知道Python的对象和调用语义正是
与祖母绿(以及其他可能的其他语言)相同,两者都
祖母绿和Python明确地基于Clu,如
芭芭拉·利斯科夫(Barbara Liskov)于1979年:
"特别是不按价值调用,因为突变
被称为例程执行的论点将是
可见呼叫者。而且不是通过参考来调用
因为未给予访问权限的变量
呼叫者,而仅针对某些对象。
弗雷德里克·伦德(Fredrik Lundh)引用:http://mail.python.org/pipermail/pyt....Ay/204379.html
"通过对象/共享呼叫"不是发明的一些新范围
comp.lang.python dweebs使python显得前卫和不同。它是
已在高度尊敬的Comp Sci圈中使用的术语
三十年。万一任何人都不识别名称:http://en.wikipedia.org/wiki/barbara_liskov
- -
史蒂文
# 回答22


乔·斯特劳特(Joe Strout)在2008年10月17日星期五09:56:17 -0600写道:否 - 它将 /引用 /复制到包含该值的对象。

对对象的引用是对象引用的值
多变的。
这是一种奇怪而不自然的观察方式。从
effbot,就像评估孩子的社会安全号码
孩子本人:http://mail.python.org/pipermail/pyt....ay/204560.html
如果我们执行Python代码行:
x ="鹦鹉"
然后问" x的价值是多少?",我想你会认为
如果我回答,我故意钝,困难和混乱
"位置0xb7cdeb2c"。
废话。 Python在将参数传递给
功能。您在功能内部获得与外部相同的参数:
....打印ID(x)
...
3083441036
3083441036
我将在这里期待您的回答:您将否认
按值调用意味着将复制列表['some',''thing']
在传递到功能之前。根据 *一些 *的定义
CBV,您甚至可能是对的。但是根据 *其他 *定义,
包括我在大学里学到的那个,该复制
数据是CBV的重要组成部分。
这些其他定义不一定是某些定义的正式定义
电脑科学家。他们同样有可能是非正式的理解
CBV和CBR的含义是什么:"如果是按值调用,请不要传递大数据
结构是因为 它们将被复制,您的代码将很慢"。
分配将RHS值复制到LHS变量。如果是
对象引用,复制的值是对象引用。
不,分配将对象绑定到名称。那就是Python所做的。
当然,在实施级别,可以实现名称绑定
通过复制对象引用。否则可能不会。那是实施
细节在Python级别无关。
或者至少在抽象泄漏之前,它不应该是相关的。 http://www.joelonsoftware.com/articl...tractions.html
[狙击]
这是一个极其广泛的主张。与爪哇没有什么不同吗?好吧,也许。
与LISP没什么不同吗?疑。与福斯没有什么不同?是的,Riiight。
说到Java,Java和Python之间有一个主要区别
关于名称。在诸如Java之类的静态打字语言中,您
在使用之前定义名称,从那时起名称是绑定的
对一个类型和对象。但是与对象的结合是可选的,
这种未结合的名字被认为是无效的。
在像python这样的动态键入语言中,名称仅绑定到
对象。您不能有一个未结合的名字:如果存在一个名称,那一定是
绑定到对象,如果不存在,您会得到一个名称
当您尝试访问它时例外。和对象是键入的,而不是名称。 http://www.ferg.org/projects/python_...e-by-side.html从技术上讲,我回想起"按名称呼叫"的定义,它们也不是。 ...然后按名称调用,无论在所谓的函数中引用的参数何处,都用作宏扩展。

感谢您的解释。显然,这不是发生的事情
Python。
啊,不,那是我的不好。我有一个奇怪而令人不安的口吃
当我的意思是在
最尴尬的时刻。对不起。
- -
史蒂文

# 回答23


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
[...]
+1 qotw
- -
史蒂夫·霍顿+1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
# 回答24


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
[...]
+1 qotw
- -
史蒂夫·霍顿+1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
# 回答25


10月17日,10:39*PM,Joe Strout 是的,虽然不是像C和Pascal这样的语言,而没有 *
对象的概念。 *我们真的应该停止提出这些 *
恐龙,而是将Python与任何现代OOP语言进行比较。
不? *有什么方法可以证明,而无需深入研究python *
源本身?

类型。这些与按值相似,并通过参考来调用
该线程已经讨论了。
我对差异的理解是值类型(所有数字
类型,结构,枚举等)实际生活在堆栈上,而
参考类型(字符串,课程等)生活在堆中,有一个
堆栈上的指针。
它很复杂b y .net使神话永存
原始(值类型)从System.Object继承(参考)
类型)。运行时确实为您自动式盒装。
这意味着,当您将值类型传递到方法时,值
*已复制。结构可以任意大,所以这可以是
性能问题。这通常是与之合作的胜利
删除间接级别时的数字类型。
但是,这并非没有问题 - 其中一些可以看到
Ironpython。
System.Drawing.Point是一个结构,但实际上是可变的
值类型。但是,当您访问它时,您经常访问副本
- 如果您尝试将其变异,那么您的更改将会丢失。
以下代码说明了问题:
0
0
由于R.Location返回一个值类型,因此其更新是"丢失"的。
根据这个定义,Python对象(全部)显然是参考
类型而不是价值类型。
在.NET中,您可以指定方法的参数为参考
(在c#或vb.net中的byref中'out')。如果您将值类型传递给
参考参数然后.NET运行时将进行拳击 /拆箱
为你。
这意味着我们可以像以下内容一样编写代码(大致为c#
伪代码):
int x = 3;
somemethod(of x);
X现在可以通过" somemethod"而突变,并且可以具有不同的值。
以"方式"不变的python类型的行为有点像.NET值类型,
和可变类型的参考类型。如您所见,这个类比
分解。
迈克尔·福德(Michael Foord)
-http://www.ironpythoninaction.com/
# 回答26


Steven d'Aprano 确实,Python的调用语义与
克鲁(Clu)和克鲁(Clu)称这些语义为"通过共享来调用"。它是
但是,Clu发明了这些呼唤语义并不是真的。
它们是LISP的呼唤语义,早在Clu存在之前。我是
但是,不确定LISP有一个名字。 LISP人倾向于
将所有变量分配称为"绑定"。
我同意那些反对致电Python/clu/lisp打电话的人
语义为"按值呼叫"或"引用呼叫",
为什么多年来我感到有些沮丧
共享"没有抓住。当使用此术语时,含义是
非常明确。
应该注意的是,现在许多其他主流语言都使用通话
通过分享。 Python至少不是奇特的。这样的
语言包括Java,JavaScript,Ruby,C#和ActionScript。
|> oug
# 回答27


在10月17日,5:39*PM,Joe Strout 是的,虽然不是像C和Pascal这样的语言,而没有 *
对象的概念。 *我们真的应该停止提出这些 *
恐龙,而是将Python与任何现代OOP语言进行比较。
不? *有什么方法可以证明,而无需深入研究python *
源本身?
如果不是,那么我认为您在谈论内部实施 *
细节。

我认为这是"矛盾的 ed示例解决了c/python差异
相当直接(都经过测试):
---------------------------------------------------
C:
struct {int a;} s1,s2;
int main()
{
S1.A = 1;
S2 = S1;
printf(" s1.a%d s2.a%d \ n",s1.a,s2.a);
S1.A = 99;
printf(" s1.a%d s2.a%d \ n",s1.a,s2.a);
}
---------------------------------------------------
Python:
班级Mystruct:
经过
s1 = mystruct()
S1.A = 1
S2 = S1
打印" S1.A%2D S2.A%2D"%(S1.A,S2.A)
S1.A = 99
打印" S1.A%2D S2.A%2D"%(S1.A,S2.A)
------------------------
C输出:
S1.A 1 S2.A 1
S1.A 99 S2.A 1
Python输出:
S1.A 1 S2.A 1
S1.A 99 S2.A 99
请注意,在C(或C ++)中,S2.a的值保持不变,因为
S1的值(S1居住的内存的内容)是
复制到S2的内存位置,然后仅此值
S2.a的改变。在Python中,S2.a被"更改"(但不是真的)
因为事实证明S2只是对象的另一个名称
S1指的是。
因此,没有程序上可以访问的"内存中的位置"
对应于Python中的S1或S2。内存中只有一个位置
这与S1当前指向的对象相对应。在C中,
相比之下,内存中有确定的位置与
变量S1和S2,这些位置始终保持分开,
在整个程序的执行过程中,截然不同且没有变化。
这不是"实施细节",它是
每种语言。由于C是汇编器上的"改进",因此变量
名称一直是内存位置的别名(或
寄存器)。您可以在任何C/C ++编译器的输出中看到这一点。
在Python中,变量只是 *参考 *的名称/别名
对象,而不是对象/值本身的名称。变量
名称本身并不直接对应于对象的内存
位置。虽然是的,从技术上讲,那些参考是的确
值必须存储在内存中的某个地方, * *是
实施细节。但不是这些位置 *
参考(即,python *变量 *的位置)是
复制到周围,是参考本身(
复制的Python *对象 *)。
该名称 - >对象映射由什么组成? *在某种程度上, *
必须有一个存储位置来存储 * *
对象,对吗?
我认为这是在上面回答的,但只是为了开车回家,在Python
变量本身的内存位置(实现
详细信息(持有对象的引用)是无法访问的。
相比之下,在C/C ++中,可变名称直接对应于内存
位置和对象,您可以轻松找到
变量。
在C/C ++中,如果选择,则可能有一个本身的变量
引用/指针指向其他内存/对象。在C中,我们会说
该变量的值是另一个对象的内存地址。
但是,如果需要的话,可以获取指针变量的地址,
哪个指向t的 *地址 * 他的另一个对象。
在Python中,变量仅是对对象的引用。你
无法获得python变量的地址,只有python对象的地址。
希望这能清除一切。
dale

# 回答28


在10月17日,下午5:39,乔·斯特劳特(Joe Strout) 是的,虽然不是像C和Pascal这样的语言
对象的概念。我们真的应该停止提出那些
恐龙,而是将Python与任何现代OOP语言进行比较。
不?有什么方法可以证明这一点,而无需深入研究
源本身?
如果没有,那么我认为您在谈论内部实施
细节。

我认为这个"无限"示例解决了(C/C ++)/Python
差异直接直接。
---------------------------------------------------
C:
struct {int a;} s1,s2;
int main()
{
S1.A = 1;
S2 = S1;
printf(" s1.a%d s2.a%d \ n",s1.a,s2.a);
S1.A = 99;
printf(" s1.a%d s2.a%d \ n",s1.a,s2.a);
}
---------------------------------------------------
Python:
班级Mystruct:
经过
s1 = mystruct()
S1.A = 1
S2 = S1
打印" S1.A%2D S2.A%2D"%(S1.A,S2.A)
S1.A = 99
打印" S1.A%2D S2.A%2D"%(S1.A,S2.A)
------------------------
C输出:
S1.A 1 S2.A 1
S1.A 99 S2.A 1
Python输出:
S1.A 1 S2.A 1
S1.A 99 S2.A 99
请注意,在C(或C ++)中,S2.a的值保持不变,因为
S1的值(S1居住的内存的内容)是
复制到S2的内存位置,然后仅此值
S2.a的改变。在Python中,S2.a被"更改"(但不是真的)
因为事实证明S2只是对象的另一个名称
S1指的是。
因此,没有程序上可以访问的"内存中的位置"
对应于Python中的S1或S2。内存中只有一个位置
这与S1当前指向的对象相对应。在C中,
相比之下,内存中有确定的位置与
变量S1和S2,这些位置始终保持分开,
在整个程序的执行过程中,截然不同且没有变化。
这不是"实施细节",它是
每种语言。由于C是汇编器上的"改进",因此变量
名称一直是内存位置的别名(或
寄存器)。您可以在任何C/C ++编译器的输出中看到这一点。
在Python中,变量只是 *参考 *的名称/别名
对象,而不是对象/值本身的名称。变量
名称本身并不直接对应于对象的内存
位置。虽然是的,从技术上讲,那些参考是的确
值必须存储在内存中的某个地方, * *是
实施细节。但不是这些位置 *
参考(即,python *变量 *的位置)是
复制到周围,是参考本身(
复制的Python *对象 *)。
该名称 - >对象映射由什么组成?在某种程度上,
必须有一个存储位置来存储对
对象,对吗?
我认为这是回答的 上面,但只是为了开车回家,在python
变量本身的内存位置(实现
详细信息(持有对象的引用)是无法访问的。
相比之下,在C/C ++中,可变名称直接对应于内存
位置和对象,您可以轻松找到
变量,尽管值可以。
在C/C ++中,如果选择,则可能有一个本身的变量
引用/指针指向其他内存/对象/数组。在C中,我们会
说该变量的值是另一个变量的内存地址
目的。但是,如果需要的话,可以获取指针的地址
变量,指向另一个对象的 *地址 *。
在Python中,变量仅是对对象的引用。你
无法获得python变量的地址,只有python对象的地址。
希望这能清除一切。
dale

# 回答29


在2008年10月27日,下午12:19,go *******@gmail.com写道:
是的,但是当然,C是一种数十年的语言,几乎没有
在汇编器上方一步。为了进行公平的比较,请选择任何现代OOP
语言,包括C衍生物(C ++,Objective-C,Java)和
将Python对象与该语言的对象进行比较,而不是
结构。
确切地!在C ++中,这就像一个指针变量。在RB的Java,
或.NET,就像对象引用。
同意。 (这是我回应一个人认为没有的人
存在这样的位置。)
正确的。变量包含对象引用;这些对象
当您将引用传递到一个
功能。这是按价值呼叫。在作业的情况下
参考被复制。该名称 - >对象映射由什么组成?在某种程度上,必须有一个存储位置来存储对theObject的引用,对吗?

我认为这是在上面回答的,但只是为了开车回家,在Python
变量本身的内存位置(实现
详细信息(持有对象的引用)是无法访问的。
正确的。在爪哇,rb,.net等中也是如此讨厌。但是缺乏
指针不会改变呼叫语义。
嗯,不,相当于对象引用的C ++等于:
someclass* foo;
实际上,许多C ++程序员更喜欢打字指向每个指针
班级,因为它是指针(相当于
您几乎总是想要的,而不是
班级本身。因此,实际上是:
SomeClassptr foo;
现在,当您这样做时:
foo2 = foo;
您正在将对象引用从foo复制到foo2,就像在
Python。当您将其传递到一个函数时:
void niftymethod(someclassptr arg){...}
...
niftymethod(foo);
您将对象引用直接复制到呼叫堆栈。这个
按价值传递,简单明了。并且因为它是按价值传递的,所以
您知道NiftyMethod所做的任何事情都无法改变价值
Foo-也就是说,可以指出其他内容。 (可能
更改DAT a它指出的对象包含,如果someclass
对象是可变的,但不能改变foo本身。)
就像Python和其他所有OOP语言一样。
通过引用致电是这样的:
void niftymethod2(someclassptr&arg){...}
...
niftymethod2(foo);
现在,在这里通过参考传递ARG(就像Byref参数一样
RB或.NET)。这意味着niftymethod2可以很好地改变
传递的价值。它实际上可以指向
其他。
没有python方法可以做到这一点,因为python的论点始终是
通过价值通过。 Python中没有参考的呼叫。时期,
故事的结尾,在这里看不到。
干杯,
- 乔

# 回答30


特别是,记忆是可写细胞的线性序列。在图灵
机器,它们没有地址,访问是通过一次性移动进行的。
随后,给出细胞计数地址为0、1、2,...。
不?有什么方法可以证明这一点,

举证责任在于那些声称积极的人。格兰特和我声称
房间里没有粉红色的大象,我们看上去
周围很彻底。您声称有。向我们展示我们错过的东西。
无论如何,假设您阅读并执行" L123 = [1,2,3]"。你可以,我
假设,在该对象上执行任何列表方法。它在哪里?一些
记忆理论说"分布,尤其是无处不在"。其他人说
"集中,一些特殊的神经元",但肯定没有什么比
线性计算机内存的"位置"。考虑另一个对象s ='boo'。
哪个地址较低?
Python是一种抽象信息算法语言,没有"源",
只是语法和语义的规范。 CPYTHON来源是
特定计算机机器实现的来源。任何这样
启动必须抽象地将无位置的对象映射到特定的对象
计算机存储器的块,而无需添加无关的,可访问的python
语义,例如相对位置。
我想你是。给python对象一个整数地址是一个
(可选)实施细节。给他们一个 *固定的 *整数地址
是可选的cpython细节,可制定代码的某些方面
更容易,但可以防止重新定位垃圾收集(我
相信Jython确实如此。
任何人都可以自由地将Python视为线性内存计算机
编程语言(在某些方面,以下不如C)。
但是,我也将其视为一种算法语言,并且
初学者(大约10年前),迅速将其称为"可执行伪代码"
(在这方面,比C优于C)。
Terry Jan Reedy

# 回答31


乔·斯特劳特(Joe Strout)在2008年10月27日星期一13:11:04 -0600写道:
是的,但是当然,C是几十年历史的语言几乎没有一步
汇编器上方。
所以呢?这不再是C不再常用。
即使C从景观中消失了,也有数百万
程序员,包括初学者的理解
术语CBR和CBV由行为O定义 F语言等语言和
帕斯卡(Pascal) - 即使他们自己还没有学习两种语言。
但是我们已经知道许多这样的语言都使用完全相同的调用
作为python的约定,所以您所表明的就是与
与python相同的呼叫惯例具有与
Python。
按照常见的用法和技术定义,c按值调用。争论
进入python的行为不像C。为什么要坚持Python是
还按价值打电话?
[狙击]
同意。 (这是我回应一个人认为没有的人
存在这样的位置。)
显然,任何基于von Newman架构的计算机
CPU Plus内存将存储引用 *某个地方 *。那是一个
细节在Python级别不重要。但是由于发条或康威
"生活"蜂窝自动机都是图灵完整的,这是可能的
构建参考值没有的Python实现
本地位于内存中的特定位置,但分布在
系统。
正确的。变量包含对象引用;这些对象引用
当您将它们传递到函数中时,被复制(未引用!)。那是
按值调用。在分配的情况下,请复制参考。
Python名称的值是分配给其的Python对象,而不是
指向对象的任意内存位置。甚至你会的
如果我执行此代码,请考虑使用它:
x ="挪威蓝"
然后坚持认为X的值为" 3086179808L,但如果我运行
代码行再次可能获得另一个值,并且自然而然地如果您运行
它在您的计算机上几乎可以肯定会获得不同的价值"。
根据您对" value =参考"的定义,以上是完全正确的,
完全,完全毫无意义,毫无用处,无济于事。相反
就像将蛋糕的成分列为"原子"。从技术上讲是正确的,但是
缺少这一点。
[狙击]
谁 *在乎 *复制指针?那是错误的水平。
最终,每种编程语言都在计算机上运行,​​并带有内存
是"刻薄的复制",但要说的是没有用的和无用的
每个编程语言都使用完全相同的呼叫的人
惯例:"碎片被翻转,这就是故事的终结"。
[狙击]
除了数百万学习术语的程序员
来自Pascal和C,这意味着值 - 数据本身,而不是
数据指示 - 已复制。这意味着这永远不会失败:
x = [1]
y =功能(x)
断言X == [1]
但是,当然可能会失败,如果函数修改x- cbv的东西
暗示不会发生。
我认为整个论点都取决于您的精神贫困
工具箱。您有锤子(按值呼叫)和螺丝刀(通过
参考)并拒绝接受可能还有其他任何
呼叫模型。因此,您将任何实际的调用模型都迫使
CBV或CBR的框架,无论您要做多少暴力
简单的术语,例如"价值" Ake它适合。
- -
史蒂文
# 回答32


很遗憾地说我对这个例子很困惑,但是如果你愿意
就像是
bob = module.Object()
frank = module.Object()
然后知道鲍勃是鲍勃的实例列表,您可以
而是做类似的事情:
适用于Listofnames中的人:
temp = module.Object(人)
list.append(temp)
__init__函数将参数分配给object.nametag或
某物。这样,您可以将名称从索引中检索到
列表,或通过搜索名称来检索索引...
- chuckk
在2008年10月16日星期四下午5:04,阿斯特利·勒·贾斯珀(Astley Le Jasper)
为什么需要找到这个?您知道它的名字是"鲍勃"。-Carsten Haesehttp://informixdb.sourceforge.net

我正在创建mulitple实例,将它们放在列表中,迭代
通过列表将它们发送到处理它们的某些功能
具有某些实例特定参数。与:
鲍勃= someObject()
harry = someObject()
fred = someObject()
parameterdict = {'鲍勃':( 0,1,2),'harry':( 3,4,5),'弗雷德':( 6,7,8)}}
people_list =(鲍勃,哈里,弗雷德)
适用于人的人:
add_parameters(人)
def add_parameters(人)
mytuple = parameterdict [??????? instance.name ????]]
person.x = mytuple [0]
person.y = mytuple [1]
person.z = mytuple [2]
...或者,可能有一种非常简单的方法
它。
-http://mail.python.org/mailman/listinfo/python-list
-http://www.badmuthahubbard.com

# 回答33


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
它的行为是否像C不是测试。
让我们看一下术语的定义:
(1)按值呼叫:实际参数是一个表达式。这是
评估并将结果分配给正式参数。
随后对正式参数的作业不影响
实际参数。
(2)通过参考来调用:实际参数是lvalue。这
形式参数成为实际参数的别名,
因此,分配给正式参数具有相同的
效果为分配给实际参数。
在我看来(1)准确地描述了参数如何传递
在Python工作。那么,为什么要坚持 *不 *按价值调用呢?
- -
格雷格
# 回答34


[我实际上很喜欢这个讨论,即使它没有解决
OP的问题。它有助于巩固 *我的 *理解。]
乔·斯特劳特(Joe Strout)写道:
是的,但是当然,C是几十年历史的语言几乎没有一步
汇编器上方。为了进行公平的比较,请选择任何现代的OOP语言,
包括C衍生物(C ++,Objective-C,Java),并比较A
Python反对该语言的对象,而不是构造。
好吧,对不起,应该从一开始就有C ++。看到我的爆发
示例在这里,我通过替换" struct"神奇地转换为C ++
带有"班级"并添加单词" public:"。不过,仍然行为相同。
我添加了byval()和byref()的函数,以表明当您过去时
值,对象的内容无法更改。这不是
可能的 在Python中,除非制作对象的副本(这就是 C ++在通过逐个价值中自动为您提供。 在Python中,对象的内容已更改,最相似 通过C ++中的参考(或指针)构造来通过。 但是,是的,作为 从技术上讲,您说: 通过对象

标签: python

添加新评论