python - 为什么你不必在 Python 中返回对象?

标签 python python-3.x

我是 Python 和一般编程的新手,我刚刚接触 OOP。在 Python 中,函数命名空间中定义的任何内容仅在该命名空间内有效;一旦超出该空间,诸如变量之类的东西就会被遗忘:

def foo():
    a = 3

print(a)

NameError: name 'a' is not defined

据我所知,除了从函数返回数据外,函数内部的任何信息在函数调用结束时都会丢失,这就是我的问题。采取以下代码:

class Example:

    def __init__(self, name):
        self.name = name

    def foo(self):
        self.name = 'John'

bar = Example('Jake')
bar.foo()
print(bar.name)

'John'

我的问题是:为什么你不必在方法之后返回对象?在普通函数中,任何变量都被遗忘,但在方法中,数据似乎实际上附加到对象本身,例如能够引用 foo() 方法self.name 尽管 self.name 首先在另一个方法中被引用。这个对吗?或者有更好的技术解释吗?

最佳答案

首先,您不必在方法中返回值,在 Python 中不需要,在许多其他编程语言中也不需要。例如:

def append_a(lst):
    lst.append('a')

bob = []
append_a(bob)
print(bob)
['a']

上面我们没有在函数中返回任何东西,但是我们用它来修改一个现有的数据结构,这几乎在任何地方都很常见。

其次,在您的第二个示例中,您创建了类 Example 的实例,当您查看 self.something 时,您正在查看该类的成员,这与其他语言不同,其中通常是成员只声明一次,在python中你可以动态添加成员。
因此,当查看 bar.name 时,您正在查看类的一个成员,它在实例 bar 上的值。如果您查看不同的实例,该值将不同。

class Example:

    def __init__(self, name):
        self.name = name

    def foo(self):
        self.name = 'John'

bar = Example('Jake')
bob = Example('Bob')
bar.foo()
print(bar.name)
print(bob.name)

John
Bob

关于python - 为什么你不必在 Python 中返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53465251/

相关文章:

python - Pandas - `loc` 在除一列之外的所有列上返回空 DataFrame

python - 如何装饰类并使用描述符访问属性?

python - Android 12 设备上的 Plyers GPS 模块存在问题

python - Pyinstaller 在 Linux 上失败,缺少 `objcopy`

Python错误: Boolean Series key will be reindexed to match DataFrame index

python - 与谷歌附近搜索的距离

python - 如何在python中编辑图表轴 pptx - 'GraphicFrame'对象没有属性 'category_axis'

python - 如何最大化非事件窗口?

python - 如何通过 Cloudflare 使用 Python 或 DDNS 检查公共(public) IP

python-3.x - CNN-尝试使用 seaborn.heatmap 运行混淆矩阵