gpt4 book ai didi

Python 和引用传递。局限性?

转载 作者:太空狗 更新时间:2023-10-30 01:39:55 32 4
gpt4 key购买 nike

我想做如下的事情:

class Foo(object):
def __init__(self):
self.member = 10
pass

def factory(foo):
foo = Foo()

aTestFoo = None
factory(aTestFoo)

print aTestFoo.member

但是它因 AttributeError: 'NoneType' object has no attribute 'member' 而崩溃:对象 aTestFoo 在函数 factory 的调用中没有被修改。

执行该操作的 pythonic 方式是什么?这是要避免的模式吗?如果是当前错误,怎么称呼?

在 C++ 中,在函数原型(prototype)中,我会添加对要在工厂中创建的指针的引用...但也许这不是我应该在 Python 中考虑的事情。

在 C# 中,有关键字 ref 允许修改引用本身,非常接近 C++ 方式。我对 Java 一无所知……但我对 Python 很感兴趣。

最佳答案

Python 没有通过引用传递。顺便说一句,这是它与 Java 共享的少数东西之一。有些人将 Python 中的参数传递描述为按值调用(并将值定义为引用,其中引用的含义与 C++ 中的含义不同),有些人将其描述为按引用传递,我觉得这很值得怀疑(他们重新定义了它)使用 Python 所谓的“引用”,并最终得到与几十年来已知的通过引用传递无关的东西,其他人则使用未被广泛使用和滥用的术语(流行的例子是“通过{object,sharing}"{pass,call}")。参见 Call By Object在 effbot.org 上对各种术语的定义、历史以及一些关于按引用传递和按值传递的术语的争论中的缺陷进行了相当广泛的讨论。

短篇小说,没有命名,是这样的:

  • 每个变量、对象属性、集合项等引用一个对象。
  • 赋值、参数传递等创建另一个引用同一对象的变量、对象属性、集合项等,但不知道哪些其他变量、对象属性、集合项等引用该对象。
  • 任何变量、对象属性、集合项等都可用于修改对象,任何其他变量、对象属性、集合项等都可用于观察该修改。
  • 没有变量、对象属性、集合项等引用另一个变量、对象属性、集合项等,因此您不能模拟通过引用传递(在 C++ 意义上),除非处理可变对象/集合作为您的“命名空间”。这太丑陋了,所以不要在有更简单的替代方法(例如返回值、异常或通过可迭代解包的多个返回值)时使用它。

您可能认为这就像在 C 中使用指针,但不是指向指针的指针(但有时是指向包含指针的结构的指针)。然后按值传递这些指针。但是不要过多解读这个比喻。 Python 的数据模型与 C 的数据模型有很大不同。

关于Python 和引用传递。局限性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12797749/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com